2013-08-30 36 views
0

================线程1如果调用pthread_cond_wait能损失信号时调用pthread_cond_signal信号之前

pthread_mutex_lock(&mutex); 
do 
{ 
    fun();//this fun will cost a long time, maybe 1-2 second 
    gettimeofday(&now, NULL); 
    outtime.tv_sec = now.tv_sec + 5; 
    outtime.tv_nsec = now.tv_usec * 1000; 
    int ret = pthread_cond_timedwait(&cond, &mutex, &outtime);  
} while((!predicate && ret != ETIMEDOUT) 
pthread_mutex_unlock(&mutex); 

============= =============线程2

pthread_mutex_lock(&mutex); 
predicate = true; 
pthread_cond_signal(&cond); 
pthread_mutex_unlock(&mutex); 

如果线程2线程1的乐趣(在发出一个信号),没有那么pthread_cond_timedwait,当乐趣()调用返回时,线程1的phread_cond_timedwait仍然可以获取thread2之前发送的信号还是不?我们可以在while()中的pthread_cond_timedwait之前调用一个耗时的乐趣吗?

回答

1

如果pthread_cond_signal在没有线程正在等待信号时被调用,则它不起作用。该信号未被储存供将来使用。

如果predicate为真,则循环中的代码不应等待条件变量。

+0

感谢pete becker,你如何看待我在循环中调用的fun(),我认为这是错误的,不应该调用任何耗费时间的函数。但是我做了一个测试程序,信号可以通过pthread_cond_wait接收,即使信号在没有pthread_cond_wait时发送,但我不确定它是否可以一直接收。 –