3

假设我们有一个全局变量和一个全局非成员函数。

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 阻止?

我的猜测是前者,但我需要听取经验丰富的程序员的意见;感谢您花时间阅读我的问题。

4

1 回答 1

9

是前者。互斥锁与您使用互斥锁保护的对象之间没有关系。(一般来说,编译器不可能准确地推断出给定代码块将修改哪些对象。)互斥锁背后的魔力完全来自它所做的时间顺序保证:线程在释放互斥锁之前所做的一切都是可见的抓住互斥锁后转到下一个线程。但是这两个线程都需要主动使用互斥锁才能实现。

真正关心线程访问和修改了哪些内存位置并在此之上安全构建的系统是“事务性内存”。它没有被广泛使用。

于 2021-11-30T06:24:26.917 回答