2011-10-23 35 views
6

我的縮短,簡化類看起來如下:「嵌套」的scoped_lock

class A 
{ 
    public: 
    // ... 
    methodA(); 
    methodB(); 

    protected: 
    mutable boost::mutex m_mutex; 
    sometype* m_myVar; 
} 

A::methodA(int someParam) 
{ 
    boost::mutex::scoped_lock myLock(m_mutex); 
    m_myVar->doSomethingElse(); 
} 

A::methodB(int someParam) 
{ 
    boost::mutex::scoped_lock myLock(m_mutex); 
    m_myVar->doSomething(); 
    this->methodA(someParam); 
} 

我想訪問的m_myVar同步。當調用A::methodB(),線程運行與相同的互斥鎖兩次,顯然對A::methodA()

第一線塊有沒有什麼辦法,使scoped_lock再次路過時,不堵同一個線程

當然,我只是可以打電話m_mutex.unlock()。但是,這將釋放其他線程等待鎖 - 這是絕對不是我想要的。

有什麼想法?

問候 托比亞斯

+8

使用'boost :: recursive_mutex'而不是'boost :: mutex' – BatchyX

回答

12

這是什麼boost::recursive_mutex它允許通過同一個線程獲得鎖而不死鎖多次。使用它而不是boost::mutex

+1

+1:你似乎在說明顯:P謝謝! – Atmocreations

0

可以使用中的tryLock如果了methodA的嘗試失敗了,你應該得到當前的threadId,並繼續執行只有當線程ID與線程ID運行於MethodB.Otherwise如果同嘗試成功,您可以繼續正常執行。

+1

這看起來像是一個等待發生的競爭條件。 – user786653

+0

通常我認爲最好的答案是來自BatchyX的評論。但我真的沒有看到任何競爭條件。你能解釋我嗎? – AlexTheo

+0

對不起,有更多的想法,你可能是正確的,它可以工作。 – user786653

4

你可以在這裏做不同的事情。您可以使用可以在同一個線程內多次獲取的遞歸互斥鎖,也可以將methodA分割爲一個私有方法,其中包含實現,並且沒有鎖和一個公用方法,該方法將鎖定並調用私有實現。然後methodB會在持有鎖的同時調用內部實現。由於該方法是私有的,因此您可以控制所有用途,並且可以確保僅在持有鎖的情況下調用實現方法。