2011-02-08 7 views
1

申し訳ありませんが、このコードがここに見つかりました - http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.htmlとmutexはこのコードで説明されていましたが、私の頭の上には少し行きました。私はミューテックスの機能を理解しており、クリティカルセクションで共有変数を保護しています。ここの特徴は私を混乱させている!私の理解では、pthread_createを使って新しいスレッドを作成しています。これはfunctionCプロセスを実行しており、カウンタをインクリメントします。カウンタは保護された変数であり、両方の関数が同時に実行されているため、カウンタはmutexで保護されていないと間違った値を返します。シンプルなCコード私は理解できません - ここでmutexは何をしていますか?

これは間違いありませんか?どうもありがとう :)。

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

void *functionC(); 
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 
int counter = 0; 

main() 
{ 
    int rc1, rc2; 
    pthread_t thread1, thread2; 

    /* Create independent threads each of which will execute functionC */ 

    if((rc1=pthread_create(&thread1, NULL, &functionC, NULL))) 
    { 
     printf("Thread creation failed: %d\n", rc1); 
    } 

    if((rc2=pthread_create(&thread2, NULL, &functionC, NULL))) 
    { 
     printf("Thread creation failed: %d\n", rc2); 
    } 

    /* Wait till threads are complete before main continues. Unless we */ 
    /* wait we run the risk of executing an exit which will terminate */ 
    /* the process and all threads before the threads have completed. */ 

    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 

    exit(0); 
} 

void *functionC() 
{ 
    pthread_mutex_lock(&mutex1); 
    counter++; 
    printf("Counter value: %d\n",counter); 
    pthread_mutex_unlock(&mutex1); 
} 

答えて

3

あなたが代わりにmutexを持っていない場合は、これは何が起こるかです:だから

// initialization 
counter = 0; 

// thread 1 runs: 
counter++; 

// context switch 
// thread 2 runs: 
counter++; 

// context switch 
// thread 1 runs and printf "Counter value: 2" 
printf("Counter value: %d\n",counter); 

// context switch 
// thread 2 runs and printf "Counter value: 2" 
printf("Counter value: %d\n",counter); 

、あなたは、この出力で終わるかもしれない:ミューテックスで、今

Counter value: 2 
Counter value: 2 

インクリメントとその印刷がアトミックに実行されるように、出力が確実に100%であることを確認します。

Counter value: 1 
Counter value: 2 

しかし決して:

Counter value: 2 
Counter value: 2 
+2

これは1つの可能なシナリオですが、もう1つは 'counter 'の最終値が1であり、2が期待されていないことです。 "Counter value:1"が2回表示されてしまうことがあります。 –

+0

真。 C言語は、++演算がアトミックかどうかを定義しません。 –

3

あなたの説明は正確です。複数のスレッドが同時にcounterを変更しようとすると、更新が失われる可能性があります。

1

はい、あなたは正しいです。ミューテックスは、スレッドがカウンタをインクリメントしようとしたときに、スレッドが互いに踏み出すのを防ぎます。

増分演算子は必ずしもアトミック演算ではないため(詳細はhereを参照)、同じ変数を複数のスレッドからインクリメントすると、予期しない結果になる可能性があります。ミューテックスは、一度に1つのスレッドのみがカウンタをインクリメントできるようにすることで、これが起こらないようにします。

最後の結合ステートメントは、メインプログラムと両方のスレッドが同時に終了することを確認します。それ以外の場合、メインプログラムは終了し、スレッドはハングしたままになります。