我在此代码中遇到了死锁。它有时会起作用,有时也不会。 我有以下简单的代码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);
答案 0 :(得分:0)
问题是在pthread_cond_wait
的所有执行完成后,pthread_cond_signal
主线程可能会被执行。如果主线程必须等待所有线程的终止,你可以使用pthread_join
,甚至信号量,但我认为它有点矫枉过正。
另一个问题是第一个发布的线程(比如thread1
)可以释放主线程(而不是thread2
和/或thread3
),所以你看到只有一个线程的输出,然后你的程序终止。再次发生这种情况只是因为主线程不等待thread1
,thread2
和thread3
。