私は、学校向けの大規模プロジェクトのスレッド同期に関するテスト プログラムを作成しています。私が書いたテスト プログラムの 1 つは、"semaphore.h" ライブラリをテストするための短いコード スニペットでした。コードは次のとおりです。
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
//Semaphore
sem_t mutex;
//Critical section variable
int crit;
//Method for pthreads
void* method()
{
int x;
//Loop to increment 'crit'
for (x = 0; x < 5000000; x++)
{
sem_wait(&mutex);
//Critical Section
crit++;
sem_post(&mutex);
}
pthread_exit(0);
}
int main()
{
pthread_t t1, t2;
sem_init(&mutex, 0, 1);
pthread_create(&t1, NULL, method, NULL);
pthread_create(&t2, NULL, method, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
sem_destroy(&mutex);
//This value should be '10000000'
printf("Value of 'crit': %d\n", crit);
return 0;
}
「crit」変数の最終値は 1,000 万になるはずですが、それに近い数値しか得られず、競合状態を示しています。コードを他のサンプルと比較したところ、正しいように見えますが、同じ問題が発生し続けています。何かご意見は?