【发布时间】:2013-06-11 14:25:31
【问题描述】:
如果我想要从一个线程写入并从另一个线程读取的单个 int,我需要使用 std::atomic,以确保其值在内核之间保持一致,无论指令是否读取和写入在概念上是原子的。如果我不这样做,则可能是读取核心在其缓存中具有旧值,并且不会看到新值。这对我来说很有意义。
如果我有一些无法以原子方式读取/写入的复杂数据类型,我需要使用一些同步原语来保护对它的访问,例如std::mutex。这将防止对象进入(或被读取)不一致的状态。这对我来说很有意义。
对我来说没有意义的是互斥锁如何帮助解决原子解决的缓存问题。它们的存在似乎只是为了防止对某些资源的并发访问,而不是将包含在该资源中的任何值传播到其他核心的缓存。我是否遗漏了一些处理这个问题的语义?
【问题讨论】:
-
我没有得到你没有得到的东西。原子具有语义 [lock global mutex;做操作;解锁全局互斥体]。只有一些具有内在支持,因此可以隐式且快速地完成。
-
仅供参考 - std::atomic 适用于所有数据类型。有趣的是,如果它太复杂,它就不会无锁 - 在这种情况下它会退回到锁。请参阅成员函数“is_lock_free()”。但是,如果你这样做而不是锁定,你仍然需要小心。
-
Balog,我了解互斥锁的语义,我了解原子如何执行它们的工作,并且我了解在 C++11 中它们正式具有额外的语义,可以防止不同的内核将旧值保留在缓存中.我不明白的是互斥锁是如何做到的。它们阻止对事物的并发访问,但我没有读过任何说明事物在不同内核的缓存中具有一致值的内容。
标签: c++ multithreading mutex