2013-06-19 62 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