2016-09-23 13 views
0

這是我正在研究的項目正在發生的一個非常基本的例子。該場景基本上是一個調用其他函數的函數,這些函數全部鎖定當前線程的資源直到完成。這是一個小例子。鎖定線程直到函數返回的問題?

void functionA() 
{ 
    lockUntilDone(); 
    //do some magic 
    functionB(); 
    //do some more magic 
} 

void functionB() 
{ 
    lockUntilDone(); 
    //make some more magic 
    functionC(); 
} 

void functionC() 
{ 
    lockUntilDone(); 
    //make a little bit more magic 
} 

lockUntilDone() - 鎖定當前線程中的資源,直到函數完成它的執行並超出範圍。

我剛開始學習使用線程和進程。 運行functionA時會發生什麼問題?如果這種情況得到擴展會怎麼樣,所以不是三級鎖定,而是4,5,6等等?或者這是鎖定線程和處理函數中的資源的典型方法?

回答

1

3,4和更多嵌套層次沒有其他問題。一般問題是當你從1級縮放到幾個。 std :: mutex不是遞歸的,這意味着即使您嘗試從已鎖定它的線程執行該操作,也不能將其鎖定兩次。所以lockUntilDone必須使用recursive_mutex's。它們也是由STL提供的,你可以使用它們,但它們不像非遞歸的那樣有效。

但還有一個考慮因素:當你必須從多個嵌套函數中鎖定相同的對象時,情況並不典型。這可能是好的,但這是代碼必須重構的一個症狀。例如,鎖可能太粗糙,可以分成幾個鎖。或者其中一些方法實際上是私有方法,它們總是從鎖定的上下文中調用,並且不需要額外的鎖定。

就個人而言,我只會在functionA中進行鎖定。如果functionB不是私有的並且可以在functionA之外被調用,那麼我將使用private函數B而不鎖定,這些函數都可以工作,並使用它從functionA和public functionB中進行鎖定並調用內部函數。