2012-02-29 4 views
2

私はいくつかのマルチスレッドプログラムを練習していましたが、この出力の背後にあるロジックを理解できませんでした。pthread関数を使った静的記憶

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

int print_message(void* ptr); 

int main() 
{ 
pthread_t thread1,thread2; 
char *mesg1 = "Thread 1"; 
char *mesg2 = "Thread 2"; 

int iret1, iret2; 

pthread_create(&thread1, NULL, print_message, (void *)mesg1); 
pthread_create(&thread2, NULL, print_message, (void *)mesg2); 

pthread_join(thread1,(void*)&iret1); 
pthread_join(thread2, (void*)&iret2); 

printf("Thread 1 return : %d\n", (int)iret1); 
printf("Thread 2 return : %d\n", (int)iret2); 
return 0; 

} 

int print_message(void *ptr) 
{ 
char *mesg; 
static int i=0; 
mesg = (char *)ptr; 
printf("%s\n",mesg); 
i++; 
return ((void*)i); 

} 

私は出力

Thread 1 
Thread 2 
Thread 1 return : 1 
Thread 2 return : 2 

期待していたが、私は、出力

Thread 1 
Thread 2 
Thread 1 return : 0 
Thread 2 return : 2 

いくつかは、これは私に明確にしてくださいでしたが取得していますか?また、pthread関数の使用上の誤りがあれば指摘してください。

答えて

4

変数iは、staticであるため、両方のスレッドで共有されます。複数のスレッド間で変数を変更する動作は定義されていないので、実際にはコンパイラがそれを与える義務がないという意味で、得られる出力と得たい出力はどちらも「間違っています。実際、使用した最適化レベルに応じて出力を変化させることができましたが、プラットフォームに応じて異なることは間違いありません。

あなたがiを変更したい場合は、ミューテックスを使用する必要がありますあなたがミューテックスを使用しない場合

int print_message(void *ptr) 
{ 
    static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
    char *mesg; 
    static int i=0; 
    int local_i; 

    mesg = (char *)ptr; 
    printf("%s\n",mesg); 
    if (pthread_mutex_lock(&mutex) == 0) { 
    local_i = ++i; 
    pthread_mutex_unlock(&mutex); 
    } 
    return ((void*)local_i); 
} 

を、あなたはあなたが得るべきだと思う出力を得るために確認になることはありません。

3

マルチスレッドに関するいくつかの良い本があります。私は非常に面白いButenhof's "Programming with Posix threads"が見つかりましたが、より最近の本が存在します。

あなたはそれらのいずれかをお読みになりましたか?いいですかpthreads tutorialはオンラインですか?

基本的に、各プログラムのソースコードスレッドは、予想通り直感的にメモリを表示しないことがあります。 (cache coherencemulti-processingmemory modelC11 ...)

具体的に言えば、スレッド間で共有データへのアクセスは、例えばsynchronizationプリミティブによって保護されるべきですmutexesまたはrwlocks

コーディングを開始する前に、実際にこれらの問題を理解する必要があります。マルチスレッドプログラムのデバッグは悪夢です(非決定論、heisenbugs)。

関連する問題