假设我们有一个全局变量和一个全局非成员函数。
int GlobalVariable = 0;
void GlobalFunction();
我们有
std::mutex MutexObject;
然后在其中一个线程中,我们有以下代码块:
{
std::lock_guard<std::mutex> lock(MutexObject);
GlobalVairable++;
GlobalFunction()
}
现在,在另一个并行运行的线程中,如果我们这样做会发生什么:
{
//std::lock_guard<std::mutex> lock(MutexObject);
GlobalVairable++;
GlobalFunction()
}
所以问题是,互斥锁是否只会在被另一个线程拥有时锁定自己,而不关心关键代码中试图访问的内容?或者编译器,或者在运行时,操作系统是否真的将关键代码中正在访问的内存位置指定为MutexObject暂时阻止?
我的猜测是前者,但我需要听取一位经验丰富的程序员的意见;谢谢你花时间阅读我的问题。
是前者。互斥对象和用互斥对象保护的对象之间没有关系。(一般来说,编译器不可能准确地推断出给定代码块将修改哪些对象。(互斥体背后的魔力完全来自于它所做的时间排序保证:线程在释放互斥体之前所做的一切,在获取互斥体之后,对下一个线程都是可见的。但这两个线程都需要主动使用互斥锁才能实现。
一个真正关心线程访问和修改了哪些内存位置并在此基础上安全构建的系统是"事务内存"。它没有被广泛使用。