c++多线程互斥锁问题

C++ Multithread Mutex Lock issue

本文关键字:问题 多线程 c++      更新时间:2023-10-16

我是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&T&&是什么意思?

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

如果您的程序的一个线程进入process_data()并正在读取一些变量,同时另一个线程进入udf_2()并修改相同的变量,您的程序不是线程安全的。换句话说,仅仅在对象中使用互斥锁是不足以保护它的。你必须通过像process_data()方法一样被保护的方法来引导对变量的访问。只有这样你的程序才是线程安全的。

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

正如你在链接中看到的,std::lock_guard一旦程序超出作用域(例如process_data()方法)就会被销毁。

lock_guard不锁定所有成员变量,只锁定在process_data()范围内访问的成员变量

使用

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

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