2013-04-16 44 views
2

我對於認真使用互斥體相當陌生。可以互斥掛起執行嗎?

在各個地方實現了幾個互斥鎖後,我意識到程序執行掛起(不退出)。我試圖調試它(在日食環境中),但我無法達到一個明確的原因(或者至少我不知道如何找到一個) 但是,我知道現在程序掛起時,它試圖做一個鎖經過幾次迭代後,成功鎖定在同一個地方。

這裏有一些代碼:

void xxx::receiveModule(timeslice now) 
{ 
    //check if you have received anything in the incoming buffer 
    if(!isIncomingDirty())// <- has a mutex inside 
     { 
      return; 
     } 
//... 
} 


bool &yyy::isIncomingDirty() { 
    boost::unique_lock<boost::shared_mutex> lock(*Communicator_Mutexes[2]));//<-this will cause hang after a few calls 
    return incomingIsDirty; 
    } 

我不知道在發生問題時死鎖會顯示什麼樣的行爲。 1-這是一個僵局嗎?

2你會在哪裏查找原因?

3-can遞歸鎖定或嵌套鎖定相同的互斥導致這種情況?

和這一個可以是題外話:

4-I交換在他們的方法由不同的線程可以使用類之間互斥。這是一種常見的做法嗎?這樣的事情是否允許?

非常感謝您的意見和解決方案

+1

死鎖通常會導致掛起一些或所有線程/進程/等不能作任何進一步的進展,就不能執行。 –

+0

@rahman是Communicator_Mutexes [2]鎖定在其他地方? –

+0

這就是我正在嘗試手動查找,但沒有運氣。任何建議找到它使用 - 監視器或某物? – rahman

回答

1

謝謝大家的好評。 正如您所看到的,問題很廣泛,問題可能是由您陳述的許多原因造成的。對我而言,這是造成死鎖的recursive locking

一個解決方案是使用boost::recursive_mutex。但爲什麼使用它時,我可以選擇第二種解決方案:首先避免遞歸鎖定
這就是我所做的,因此解決了問題。

再次感謝