2013-04-16 149 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); 
    ...... 
} 

意味着,到达此行的任何线索,将不会从锁的构造函数返回,直到其他线程是过去创造的锁尚未退出的范围。换句话说,您使用省略号表示的代码一次最多只能执行一个线程,从而有效地序列化对代码的访问。