C ++多线程互斥锁问题

时间:2013-04-16 14:45:57

标签: c++ multithreading templates locking std

我不熟悉C ++&多线程。最近看看Lock属性......

假设我有一个内部有互斥的类。当我在互斥对象上使用锁定方法时,我怎么能告诉阻止/锁定哪个部分的编码?它是阻止/锁定类中的所有成员函数还是仅阻止/锁定我触发锁定的成员函数?

e.g。 (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&amp;是什么意思?和T&amp;&amp; ?

感谢。

3 个答案:

答案 0 :(得分:2)

互斥锁不会锁定您的对象。 mutex提供对程序的一部分的独占访问权限,该程序介于互斥锁和解锁之间。

如果程序的一个线程进入process_data()并正在读取某个变量,同时另一个线程进入udf_2()并修改同一个变量,您的程序不是线程安全的< / strong>即可。换句话说,仅在对象内部使用互斥锁不足以保护它。您必须通过像方法process_data()一样受到保护的方法来管理对变量的访问。只有这样你的程序才是线程安全的。

我希望我说清楚。

答案 1 :(得分:1)

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

正如您在链接中看到的那样,只要程序超出范围(例如process_data()方法),std :: lock_guard就会被破坏。

lock_guard不会锁定所有成员变量,只会锁定在作用域或process_data()中访问的成员变量

答案 2 :(得分:1)

使用

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

表示任何到达此行的线程都不会从锁的构造函数返回,直到任何其他经过锁创建的线程都没有退出作用域。换句话说,使用省略号表示的代码一次只能由一个线程执行,有效地序列化对代码的访问。