【发布时间】:2020-10-12 14:36:29
【问题描述】:
我想测试 pthread_cond_wait 来暂停一个线程,但它只是在 printf("thread2");声明。
我的代码:
#include <stdio.h>
#include <pthread.h>
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
volatile int done = 1;
void *testf(void* no) {
while (1) {
printf("thread1\n");
pthread_mutex_lock(&mut);
pthread_cond_wait(&cond, &mut);
pthread_mutex_unlock(&mut);
printf("thread2\n");
done = 0;
}
}
int main() {
printf("mthread1\n");
pthread_t pt;
pthread_create(&pt, NULL, &testf, NULL);
printf("mthread2\n");
pthread_mutex_lock(&mut);
printf("mthread3\n");
pthread_cond_signal(&cond);
printf("mthread4\n");
pthread_mutex_unlock(&mut);
printf("mthread5\n");
while (done);
return 0;
}
为什么在 cond_signal() 之后没有恢复?它应该恢复。
【问题讨论】:
-
看起来对我来说是个僵局。
-
主线程在其他线程调用pthread_cond_wait之前调用pthread_cond_signal。当它开始等待时,它永远不会等待,因为它永远不会收到信号,因为信号已经发生了。
-
您必须确保在调用 pthread_cond_signal() 之前启动了辅助线程。因为当 pthread_create() 返回时,你并不确定辅助线程是否启动。
-
条件变量的信号不排队。如果在发出信号时没有任何东西在等待,则将其忽略。
-
屏障可以在这里起作用:pthread_barrier_init(), pthread_barrier_wait()
标签: c multithreading pthreads