C++:Boost::互斥锁分别锁定同一作用域中的多个变量
C++: Boost::mutex individually locking multiple variables in same scope
我是多线程的新手,正在尝试使用互斥。我确信我理解什么是互斥的概念,但是我发现关于实际使用它们的文档非常缺乏。我遇到的一个主要问题是试图控制对特定变量的访问。
当我锁定互斥对象时(无论我使用哪种锁),会发生什么?似乎没有任何方法可以将特定的变量/资源分配给互斥对象,所以它只是锁定作用域中的所有变量吗?如果变量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();
这可能已经很明显了,但请记住,如果你想在一个结构中保留一个互斥对象及其保护的数据,你就不能复制该结构的实例,因为互斥对象是不可复制的。
相关文章:
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 未在此作用域中声明的函数和变量 (C++)
- 如何在C++中访问作用域的变量输出?
- 不同块作用域中的 C++ 变量具有相同的地址
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- Tictactoe 游戏变量未在作用域中声明
- C++If语句变量作用域
- 即使在离开作用域后,如何访问在堆上分配的变量C++?
- C++ 在方程中使用变量;错误:表达式必须具有整数或无作用域枚举类型及其他
- 局部变量的作用域是块或函数
- 当变量在多个函数作用域中使用时,我应该在类 private 中声明该变量吗?
- C++11 外部作用域变量声明为 auto
- 是一个初始化为未确定值或未初始化的本地作用域变量
- 命名空间作用域变量的c++初始化
- c++双删除文件作用域变量,链接问题
- 线程局部全局作用域变量
- 嵌套while循环中的作用域变量
- 如何从函数内部修改作用域变量
- c++中不一致的文件作用域变量行为