当前位置: 技术问答>linux和unix
关于pthread_cond_wait的一个简单问题!
来源: 互联网 发布时间:2015-05-06
本文导语: 我使用pthread_cond_wait来阻塞主线程和又主线程创建的子线程,在主线程中调用pthread_cond_signal可以唤醒子线程,可是在子线程中调用pthread_cond_signal却不能唤醒主线程,为什么?下面是部分代码, pthread_mutex_t mutex, main_m...
我使用pthread_cond_wait来阻塞主线程和又主线程创建的子线程,在主线程中调用pthread_cond_signal可以唤醒子线程,可是在子线程中调用pthread_cond_signal却不能唤醒主线程,为什么?下面是部分代码,
pthread_mutex_t mutex, main_mutex;
pthread_cond_t cond, main_cond;
void * connect_process(void * pParam);
int main()
{
pthread_t th;
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
pthread_mutex_init(&main_mutex,NULL);
pthread_cond_init(&main_cond,NULL);
pthread_create(&th,connect_process,NULL,NULL);
pthread_cond_signal(&cond);
pthread_mutex_lock (&main_mutex);
pthread_cond_wait( &main_cond, &main_mutex);
pthread_mutex_unlock (&main_mutex);
printf("main thread is wakedn");
}
void * connect_process(void * pParam)
{
pthread_mutex_lock (&mutex);
pthread_cond_wait( &cond, &mutex);
pthread_mutex_unlock (&mutex);
pthread_cond_signal(&main_cond);
printf("sub thread is wakedn);
}
pthread_mutex_t mutex, main_mutex;
pthread_cond_t cond, main_cond;
void * connect_process(void * pParam);
int main()
{
pthread_t th;
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
pthread_mutex_init(&main_mutex,NULL);
pthread_cond_init(&main_cond,NULL);
pthread_create(&th,connect_process,NULL,NULL);
pthread_cond_signal(&cond);
pthread_mutex_lock (&main_mutex);
pthread_cond_wait( &main_cond, &main_mutex);
pthread_mutex_unlock (&main_mutex);
printf("main thread is wakedn");
}
void * connect_process(void * pParam)
{
pthread_mutex_lock (&mutex);
pthread_cond_wait( &cond, &mutex);
pthread_mutex_unlock (&mutex);
pthread_cond_signal(&main_cond);
printf("sub thread is wakedn);
}
|
代码上好像没有问题。可能是时序的问题:在子线程调用signal时,主线程尚未进入wait状态。
你在线程函数的
pthread_cond_signal(&main_cond);
前加一句
sleep(3);
在试试
另外,如果没有任何线程wait一个pthrea_cond_t对象,cond_signal消息将被丢弃。在极端情况下,上面的代码会导致死锁:子线程已启动,但在调用pthread_cond_wait之前切换到主线程;主线程调用pthread_cond_signal,由于子线程尚未调用pthread_cond_wait,该消息丢失。接着主线程等待子线程唤醒它;在某个时刻,子线程又开始执行,等待那个已经丢失的signal消息。
你在线程函数的
pthread_cond_signal(&main_cond);
前加一句
sleep(3);
在试试
另外,如果没有任何线程wait一个pthrea_cond_t对象,cond_signal消息将被丢弃。在极端情况下,上面的代码会导致死锁:子线程已启动,但在调用pthread_cond_wait之前切换到主线程;主线程调用pthread_cond_signal,由于子线程尚未调用pthread_cond_wait,该消息丢失。接着主线程等待子线程唤醒它;在某个时刻,子线程又开始执行,等待那个已经丢失的signal消息。
|
你pthread_create()参数赋值不对吧?
子线程不能唤醒主线程?我这里可以啊:我把connect_process()改成这样:
void * connect_process(void * pParam)
{
// pthread_mutex_lock (&mutex);
// pthread_cond_wait( &cond, &mutex);
// pthread_mutex_unlock (&mutex);
sleep(3);
pthread_cond_signal(&main_cond);
printf("sub thread is wakedn");
}
运行后输出:
sub thread is waked
main thread is waked
说明主线程被唤醒
子线程不能唤醒主线程?我这里可以啊:我把connect_process()改成这样:
void * connect_process(void * pParam)
{
// pthread_mutex_lock (&mutex);
// pthread_cond_wait( &cond, &mutex);
// pthread_mutex_unlock (&mutex);
sleep(3);
pthread_cond_signal(&main_cond);
printf("sub thread is wakedn");
}
运行后输出:
sub thread is waked
main thread is waked
说明主线程被唤醒