Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:互斥锁单独锁定同一范围内的多个变量_C++_Multithreading_Boost - Fatal编程技术网

C++ C++;:互斥锁单独锁定同一范围内的多个变量

C++ C++;:互斥锁单独锁定同一范围内的多个变量,c++,multithreading,boost,C++,Multithreading,Boost,我是多线程新手,正在尝试使用互斥锁。我很确定我理解互斥体的概念,但是我发现关于实际使用互斥体的文档非常缺乏。我遇到的主要问题之一是试图控制对特定变量的访问 当我锁定互斥锁时(无论使用哪种锁),会发生什么情况?似乎没有任何方法可以将特定的变量/资源分配给互斥体,所以它只是锁定范围内的所有变量吗?如果变量A和变量B都声明在同一个作用域中,我想分别对它们进行互斥(即线程1可以访问变量A,而线程2可以访问变量B)?互斥锁锁定对其保护的每个作用域的访问,它不会锁定变量本身 如果要保护单个变量,请分别用或包

我是多线程新手,正在尝试使用互斥锁。我很确定我理解互斥体的概念,但是我发现关于实际使用互斥体的文档非常缺乏。我遇到的主要问题之一是试图控制对特定变量的访问

当我锁定互斥锁时(无论使用哪种锁),会发生什么情况?似乎没有任何方法可以将特定的变量/资源分配给互斥体,所以它只是锁定范围内的所有变量吗?如果变量
A
和变量
B
都声明在同一个作用域中,我想分别对它们进行互斥(即线程1可以访问变量
A
,而线程2可以访问变量
B
)?

互斥锁锁定对其保护的每个作用域的访问,它不会锁定变量本身


如果要保护单个变量,请分别用或包装它,或者为每个变量指定单独的互斥体。

互斥体不会显式地分配给变量。当互斥锁被锁定时,获得锁的线程会处理您想要保护的任何变量,这更像是一种关联

将互斥体与变量关联的一种方法是将受保护的变量与互斥体一起保存在一个结构中。例如,如果我有一个整数向量,我想确保一次只能被一个线程访问,那么我可以创建一个如下的结构:

struct VectorDataType {
   boost::mutex theLock;
   std::vector<int> theData;
};

VectorDataType myVector;
这可能已经很明显了,但是请记住,如果您想在一个包含它所保护的数据的结构中保留一个互斥体,您不能复制该结构的实例,因为互斥体是不可复制的

myVector.theLock.lock();
myVector.theData.push_back(1234);
myVector.theLock.unlock();