互斥体是否锁定自身或有问题的内存位置?

Phy*_*ian 3 c++ multithreading mutex shared-resource

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

int GlobalVariable = 0;
void GlobalFunction();
Run Code Online (Sandbox Code Playgroud)

我们有

std::mutex MutexObject;
Run Code Online (Sandbox Code Playgroud)

然后在其中一个线程中,我们有这样的代码块:

{
std::lock_guard<std::mutex> lock(MutexObject);
GlobalVairable++;
GlobalFunction()
}
Run Code Online (Sandbox Code Playgroud)

现在,在另一个并行运行的线程中,如果我们这样做会发生什么:

{
//std::lock_guard<std::mutex> lock(MutexObject);
GlobalVairable++;
GlobalFunction()
}
Run Code Online (Sandbox Code Playgroud)

所以问题是,互斥体是否在被另一个线程拥有时只锁定自己,而不关心在关键代码中尝试访问的内容?或者编译器,或者在运行时,操作系统实际上指定了关键代码中正在访问的内存位置,目前被 MutexObject 阻止?

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

Sne*_*tel 9

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

\n

真正关心线程访问和修改的内存位置并在此基础上安全构建的系统是\xe2\x80\x9c事务内存\xe2\x80\x9d。它\xe2\x80\x99s 没有被广泛使用。

\n