3

私は、学校向けの大規模プロジェクトのスレッド同期に関するテスト プログラムを作成しています。私が書いたテスト プログラムの 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 万になるはずですが、それに近い数値しか得られず、競合状態を示しています。コードを他のサンプルと比較したところ、正しいように見えますが、同じ問題が発生し続けています。何かご意見は?

4

1 に答える 1

1

あなたのクリティカル セクションはまったくロックされていません。この仮説は、あなたの症状によく当てはまります。

sem_init()ENOSYSで失敗しています。 sem_wait()その後、sem_post()EINVAL でsem_destroy()失敗し、同様に失敗します (おそらく ENOSYS で再び失敗します)。ワーカー スレッドが互いのインクリメントを踏んでいます。

OS X を使用していますか? これは、名前のない POSIX セマフォをサポートしていない現在最も一般的なプラットフォームです。サポートされている同じヘッダー ファイルで定義されている名前付きセマフォ インターフェイスを試してください。

于 2013-10-22T02:34:19.513 に答える