【发布时间】:2017-06-30 11:10:44
【问题描述】:
假设我有一些课程,无论它可能具有什么样的性质。我想在线程之间共享这个类的一个对象。过去,我认为mutex(虽然它可能不是最有效的方式)足以确保一切正常。
现在,我已经阅读了一些关于 std::atomic 的内容,即使对于简单的布尔引用也是必要的:Do I have to use atomic<bool> for "exit" bool variable?
虽然我理解为什么 bool 应该是原子的,但我不明白简单的互斥锁如何防止以下问题:
其次,当两个线程运行在不同的内核上时,它们有独立的缓存;写入值会将其存储在缓存中,但不会更新其他缓存,因此一个线程可能看不到另一个线程写入的值。
互斥锁不仅仅是一种确保其他线程无法锁定互斥锁的机制吗?但在互斥体区域内,我可能会玩弄一大堆变量。编译器可能不知道涉及哪些变量。
因此,目前对我来说,简单地在所有包含共享资源的区域周围放置一个基于互斥锁的锁似乎还不够。会不会因为线程缓存不会更新,所以两个线程有不同版本的资源?
【问题讨论】:
-
this 会回答你的问题吗?
-
@Default 不完全。它说在 C++0x 之前没有任何保证,但它没有详细说明 C++0x 如何提供帮助。 manni66 的回答更有见地
-
还有内存栅栏,它被CPU用作一种序列点来同步内存。所以你有一个机制来同步所有内核和线程的内存和缓存以及一个同步原语,互斥锁。有关说明,请参阅 stackoverflow.com/questions/7280119。
标签: c++ multithreading