2013-06-19 60 views
0

我有一个关于多线程同步的问题.. 我们假设我们有2个pthread和一个fifo队列。 线程1将在此队列中插入元素,线程2将从同一队列中提取这些元素。 我实现了我的队列的两个操作:push和pop。然后pthread和同步

void push(element e) { 

pthread_mutex_lock(&mutex); 
myVector.push_back(e); 
pthread_cond_signal(&empty); 
pthread_mutex_unlock(&mutex); 

} 

Element pop() { 

pthread_mutex_lock(&mutex); 
if(myVector.size() == 0) 
pthread_cond_wait(&empty, &mutex); 
//extract the element from the queue; 
pthread_mutex_unlock(&mutex); 

} 

的线程2将有这样的生命周期:

while(myBoolFlag) { 
    Element theElement = myQueue->pop(); 
usleep(500000); 

} 

这个代码可以导致死锁的情况呢? 等待之前,我必须解锁互斥锁吗?

+3

这很好,但是您需要使用'while'而不是'if'来检查谓词(请参阅http://stackoverflow.com/q/6206350/768469) – Nemo

回答

0

没有死锁可见。

pthread_cond_wait()隐式释放互斥量。

但是,您可以在pthread_cond_signal()之前调用pthread_mutex_unlock()

+1

更清晰的是,它会释放它的持续时间等待,并在返回之前重新获取它。 –

+0

是的,谢谢你添加这个,实际上是'pthread_cond_wait()'的行为的基本部分。 – alk

+1

不,你不应该在信号之前移动解锁,因为它没有购买任何东西,并且可以降低性能(http://stackoverflow.com/a/6312416/768469) – Nemo