C++;多线程互斥锁问题 我是C++和多线程的新手。最近查看锁属性

C++;多线程互斥锁问题 我是C++和多线程的新手。最近查看锁属性,c++,multithreading,templates,locking,std,C++,Multithreading,Templates,Locking,Std,假设我有一个内部有互斥锁的类。当我在互斥对象上使用lock方法时,如何判断代码的哪个部分被阻止/锁定?它是阻止/锁定类中的所有成员函数,还是仅阻止/锁定触发锁的成员函数 e、 g.(过程数据和自定义项2) 类数据包装器 { 私人: int x; 一些数据; std::互斥m; 公众: 模板 作废处理数据(函数func) { 标准:锁紧装置l(m); ...... } 无效udf_2(整数x) { cout 正如您在链接中看到的,程序一旦超出范围(例如process_data()方法),std::

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

e、 g.(过程数据和自定义项2)

类数据包装器 { 私人: int x; 一些数据; std::互斥m; 公众: 模板 作废处理数据(函数func) { 标准:锁紧装置l(m); ...... } 无效udf_2(整数x) { cout

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

lock\u guard不会锁定所有成员变量,只锁定在作用域或进程数据()中访问的变量。

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


lock\u guard不会锁定所有成员变量,只锁定在作用域或process\u data()中访问的变量。互斥锁不会锁定对象。互斥锁提供对位于互斥锁和解锁之间的程序部分的独占访问

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


我希望我能说清楚。

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

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

我希望我能说清楚。

使用

void process_data(Function func)
{
    std::lock_guard<std::mutex> l(m);
    ......
}
void进程_数据(函数func)
{
标准:锁紧装置l(m);
......
}
这意味着任何到达此行的线程都不会从锁的构造函数返回,直到创建锁之后的任何其他线程都没有退出作用域。换句话说,使用省略号表示的代码一次最多只能由一个线程执行,从而有效地序列化对代码的访问。

使用

void process_data(Function func)
{
    std::lock_guard<std::mutex> l(m);
    ......
}
void进程_数据(函数func)
{
标准:锁紧装置l(m);
......
}

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

Rem已删除您的C#标记。请仅使用与问题相关的标记。已删除您的C#标记。请仅使用与问题相关的标记。那么这是否意味着类中的所有成员变量都未被std::lock#u guard()锁定?(例如,x,data),并且它仅锁定了进程#u data(),而未锁定udf#2()?是的。事实上,没有成员被“锁定”。锁只为进入该方法的线程提供互斥。即,只允许一个线程通过。由于只允许一个线程通过,这实现了“锁定”的效果。就好像代码被该线程锁定,并且只允许该线程修改某个内容,而其他线程被阻止并删除一样t等待锁定线程释放锁,即离开创建std::lock_guards的方法。那么这是否意味着类中的所有成员变量都没有被std::lock_guards()锁定?(例如,x,data),它只锁定了进程_data(),而没有锁定udf_2()?是的。事实上,没有成员被“锁定”。锁只为进入该方法的线程提供互斥。即,只允许一个线程通过。由于只允许一个线程通过,这实现了“锁定”的效果。就好像代码被该线程锁定,并且只允许该线程修改某个内容,而其他线程被阻止并删除一样t等待锁定线程释放锁,即保留创建std::lock\u guardSo的方法。就作用域而言,这是否意味着它将只锁定调用lock\u guard()的方法?就作用域而言,这是否意味着它将只锁定调用lock\u guardSo()的方法?