問題
Cによる排他制御の入門の内容です.
スレッド1が sumに「2」を加算.
スレッド2が sumに「3」を加算.
1回の処理でスレッド1,2の合計で「5」を加算できれば良くて,
最終的に sum=50000になれば正解なのですが,30000ほどの結果になってしまいます.
排他制御に精通している方,是非よろしくお願いします!
実現したいこと
・正しく機能しない理由を知りたい
・sum=50000 になるように排他制御を修正したい.
該当のソースコード
#include <stdio.h> #include <stdlib.h> #include <err.h> #include <pthread.h> #include <unistd.h> #include <string.h> #define TRUE 1 #define FALSE 0 const size_t loop_max = 10000; int flag = FALSE; int sum = 0; void f1(); void f2(); int main(int argc, char *argv[]) { pthread_t thread1, thread2; int ret1,ret2; pthread_create(&thread1,NULL,(void *)f1,NULL); pthread_create(&thread2,NULL,(void *)f2,NULL); pthread_join(thread1,NULL); pthread_join(thread2,NULL); printf("done\n"); printf("sum=%d\n", sum); return 0; } void f1() { size_t i; printf("start thread1\n"); for(i=0; i<loop_max; i++){ while(flag){} flag = TRUE; sum += 2; flag = FALSE; } printf("finish thread1\n"); } void f2() { size_t i; printf("start thread2\n"); for(i=0; i<loop_max; i++){ while(flag){} flag = TRUE; sum += 3; flag = FALSE; } printf("finish thread2\n"); }
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。