多线程中的死锁

时间:2018-01-06 18:01:09

标签: c multithreading concurrency parallel-processing mutex

我在此代码中遇到了死锁。它有时会起作用,有时也不会。 我有以下简单的代码3线程和互斥。我希望每个线程都等待,然后在等待之后,发出第一个运行信号,一个信号表示第二个,第二个,第三个。

void *thread1(void *a) {
   pthread_mutex_lock(&mutex);
   pthread_cond_wait(&cond, &mutex);
   pthread_mutex_unlock(&mutex);
   fprintf(stdout, "Thread %d.\n", 1);
   pthread_cond_signal(&cond);//release wait
   pthread_exit(NULL);
}
void *thread2(void *a) {
   pthread_mutex_lock(&mutex);
   pthread_cond_wait(&cond, &mutex);
   pthread_mutex_unlock(&mutex);
   fprintf(stdout, "Thread %d.\n", 2);
   pthread_cond_signal(&cond);//release wait
   pthread_exit(NULL);
}
void *thread3(void *a){
   pthread_mutex_lock(&mutex);
   pthread_cond_wait(&cond, &mutex);
   pthread_mutex_unlock(&mutex);
   fprintf(stdout, "Thread %d.\n", 3);
   pthread_cond_signal(&cond);//release wait
   pthread_exit(NULL);
}

for(int i=0;i<3;i++)
  pthread_create(&threads[i], &attr, (void *) timer, (void *) timer);

pthread_cond_signal(&cond);//release wait
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);

1 个答案:

答案 0 :(得分:0)

问题是在pthread_cond_wait的所有执行完成后,pthread_cond_signal主线程可能会被执行。如果主线程必须等待所有线程的终止,你可以使用pthread_join,甚至信号量,但我认为它有点矫枉过正。

另一个问题是第一个发布的线程(比如thread1)可以释放主线程(而不是thread2和/或thread3),所以你看到只有一个线程的输出,然后你的程序终止。再次发生这种情况只是因为主线程不等待thread1thread2thread3