C++:Boost::互斥锁分别锁定同一作用域中的多个变量

C++: Boost::mutex individually locking multiple variables in same scope

本文关键字:作用域 变量 锁定 Boost C++      更新时间:2023-10-16

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

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

Mutex锁定对其保护的每个作用域的访问,而不锁定变量本身。

如果要保护单个变量,请分别用std::atomic<T>boost::atomic<T>包装它,或者为每个变量指定单独的互斥对象。

互斥不会显式分配给变量。作为一名开发人员,这更像是一种关联,当互斥锁被锁定时,获得锁的线程可以处理任何你想要保护的变量。

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

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

然后,每当我想修改整数向量时,我都会确保首先获得锁,同样记得在完成后解锁:

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

这可能已经很明显了,但请记住,如果你想在一个结构中保留一个互斥对象及其保护的数据,你就不能复制该结构的实例,因为互斥对象是不可复制的。