0

以下に示す pthread プログラムは、pthread でのミューテックスの例を示しています。しかし、このコードの実行中にほとんどの場合デッドロックが発生し、一部の実行では正しい結果が得られます。

#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
volatile int sv=10;
volatile int x,y,temp=10;
pthread_mutex_t mut;
pthread_cond_t con;
void *ChildThread(void *arg)
{
pthread_mutex_lock (&mut);
pthread_cond_wait(&con, &mut);  
x=sv;
x++;
sv=x;
printf("The child sv is %d\n",sv);
pthread_mutex_unlock (&mut);
pthread_exit(NULL);
}

void *ChildThread2(void *arg)
{
pthread_mutex_lock (&mut);
y=sv;
y--;
sv=y;
printf("The child2 sv is %d\n",sv); 
pthread_cond_signal(&con);
pthread_mutex_unlock (&mut);
pthread_exit(NULL);
}

int main(void)
{
pthread_t child1,child2,child3;
pthread_mutex_init(&mut, NULL);
pthread_create(&child2,NULL,ChildThread2,NULL);
pthread_create(&child1,NULL,ChildThread,NULL);
pthread_cond_destroy(&con);
pthread_mutex_destroy(&mut);
pthread_join(child1,NULL);
pthread_join(child2,NULL);
return 0;
}
4

3 に答える 3

2

ここでのデッドロックは、の誤用が原因である可能性がありpthread_cond_wait()ます。通常pthread_cond_wait()、ループで呼び出して、条件を確認します。

while (!cond)
    pthread_cond_wait(...);

その時点でpthread_cond_signal()スリープしているスレッドのみをpthread_cond_wait()ウェイクアップするため、シグナリング スレッドが最初に実行されると、ウェイターは決してウェイクアップしません。

ここでの他の問題は、スレッドが完了する前に条件変数とミューテックスを破棄していることです。これは通常、予期しない動作につながります。pthread_join()リソースを奪う前にスレッドを削除する必要があります。また、条件変数を初期化することもありません。

于 2013-09-23T10:00:52.097 に答える
0

静的ミューテックスや条件を init 関数で動的に初期化したり、最後に破棄したりする必要はありません。変数andの定義でPTHREAD_MUTEX_INITIALIZERandを使用します。PTHREAD_COND_INITIALIZERmutcond

pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t con = PTHREAD_COND_INITIALIZER;

そして、_initand_destroy関数のすべての呼び出しを消去します。

于 2013-09-23T10:08:08.247 に答える
0

問題の 1 つは、条件変数を初期化しないことです。もう 1 つは、mutex を使用するスレッドがまだ実行されている間に、mutex を破棄する (そして、初期化されていない条件変数を破棄しようとする) ことです。

于 2013-09-23T10:00:00.167 に答える