【问题标题】:Does a mutex lock itself, or the memory positions in question?互斥锁是否会锁定自身,或者有问题的内存位置?
【发布时间】:2022-01-06 22:02:00
【问题描述】:

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

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

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

【问题讨论】:

  • lock 只不过是一把锁,它不知道自己锁的是什么。它只执行两个操作:lockunlock。就是这样。

标签: c++ multithreading mutex shared-resource


【解决方案1】:

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

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

【讨论】:

  • 虽然 C++ 还没有事务内存(只有一些 TS),但可以创建一个使用硬件事务内存的互斥锁。 Intel TBB libary 提供了一个 speculative mutex 类,该类使用 Intel TSX(以前的 HLE,目前的 RTM,因为 HLE 已被弃用和删除)
猜你喜欢
  • 2011-05-20
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多