两个线程的共同资源 - 同步足够吗?

时间:2017-06-30 11:10:44

标签: c++ multithreading

说我有一些类可能有它的性质。我想在线程之间共享此类的对象。在过去,我会认为mutex - 尽管它可能不是最有效的方式 - 足以确保一切正常。

现在,我已经阅读了一些关于std::atomic的内容,即使对于简单的bool引用也是如此:Do I have to use atomic<bool> for "exit" bool variable?

虽然我理解为什么bool应该是原子的,但我不明白一个简单的互斥锁如何防止以下问题:

  

其次,当两个线程在不同的核心上运行时,它们具有单独的缓存;写一个值会将它存储在缓存中,但不会更新其他缓存,因此线程可能看不到另一个线程写入的值。

互斥锁不仅仅是一种确保某些其他线程无法锁定互斥锁的机制吗?但在互斥区域内,我可能会玩弄一大堆变量。编译器可能不知道涉及哪些变量。

因此,简单地在包含共享资源的所有区域周围放置一个基于互斥锁的锁定对我来说似乎不够。难道不是两个线程都有这个资源的不同版本,因为线程缓存不会被更新吗?

1 个答案:

答案 0 :(得分:1)

C ++存储模型保证一个线程中对象的更改对于其他线程是可见的,如果它们受互斥锁保护的话。有关详细信息,请参阅http://en.cppreference.com/w/cpp/language/memory_model