0

我是 C++ 和多线程的新手。最近在看Lock属性...

假设我有一个里面有互斥锁的类。当我在互斥对象上使用 lock 方法时,如何判断代码的哪一部分被阻塞/锁定?它是阻止/锁定类中的所有成员函数还是仅阻止/锁定我触发锁定的成员函数?

例如(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&and是什么意思T&&

4

3 回答 3

3

互斥锁不会锁定您的对象。互斥锁提供对位于互斥锁和解锁之间的程序部分的独占访问。

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

我希望我说清楚。

于 2013-04-16T14:53:29.133 回答
1

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

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

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

于 2013-04-16T14:48:07.550 回答
1

使用

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

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

于 2013-04-16T15:00:16.263 回答