2013-04-16 147 views
0

我是C++新手&多線程。最近看看Lock屬性...C++多線程互斥鎖問題

假設我有一個內部有互斥鎖的類。當我在互斥對象上使用鎖定方法時,如何知道編碼的哪一部分被阻止/鎖定?它會阻止/鎖定類中的所有成員函數還是僅鎖定我觸發鎖的成員函數?

例如(process_data & udf_2)

class data_wrapper 
{ 
private: 
    int x; 
    some_data data; 
    std::mutex m; 
public: 
    template<typename Function> 
    void process_data(Function func) 
    { 
     std::lock_guard<std::mutex> l(m); 
    ...... 
    } 
    void udf_2(int x) 
    { 
     cout << "Value is " << x; 
    ...... 
    } 
} 

=============================

===== ========================

還有一個問題是,如果我看到一個模板類型T,那麼T &和T & &?

謝謝。

+0

刪除了C#標記。請僅使用與問題相關的標籤。 – tnw

回答

1

http://en.cppreference.com/w/cpp/thread/lock_guard

正如你可以在鏈路的std :: lock_guard看到的是作爲程序超出範圍,一旦破壞(例如process_data()方法)。

lock_guard不鎖定所有的成員變量,但在範圍或process_data()

+0

所以就範圍而言,它是否意味着它只會鎖定調用lock_guard()的方法? –

+0

是的,這意味着 –

2

互斥犯規鎖定對象訪問剛剛的。互斥鎖提供對互斥鎖和解鎖之間的部分程序的獨佔訪問。

,如果你的程序的一個線程進入process_data()並閱讀一些變量,並在同一時間的另一個線程進入udf_2()並修改同一個變量,你的程序是不是線程安全。換句話說,只是在對象內部使用互斥體不足以保護它。您必須通過像您的方法process_data()這樣守衛的方法來鏈接對變量的訪問。只有你的程序將是線程安全的。

我希望我說清楚。

+0

所以這意味着類中的所有成員變量都沒有被std :: lock_guard()鎖定? (例如x,data)它只鎖定process_data()而不是udf_2()? –

+0

是的。實際上沒有成員被「鎖定」。一個鎖只能爲進入該方法的線程提供互斥。即只允許一個線程通過。並且由於只有一個線程被允許通過,這實現了'鎖定'的效果。就好像代碼被該線程鎖定一樣,只有該線程被允許修改某些內容,並且其他線程被阻塞,並且必須等待鎖定線程釋放該鎖,即保留創建std :: lock_guard的方法 – weima

1

使用

void process_data(Function func) 
{ 
    std::lock_guard<std::mutex> l(m); 
    ...... 
} 

意味着,到達此行的任何線索,將不會從鎖的構造函數返回,直到其他線程是過去創造的鎖尚未退出的範圍。換句話說,您使用省略號表示的代碼一次最多隻能執行一個線程,從而有效地序列化對代碼的訪問。