记忆障碍和互斥体

时间:2014-07-20 10:14:23

标签: multithreading memory mutex barrier

给定两个线程之间的通用消息传递模式:

Thread-A                  Thread-B
-------------------       ---------------------
LockMutex(M1)
Get memory for Msg
  from shared resource
UnlockMutex(M1)

set Msg attributes (content)
(note: is *NOT* performed
 within a critical section--
 once the Msg's contents
 have been set, no other
 writes to the Msg 
 is performed)

LockMutex(M1)
place pointer of Msg
  within Thread-B's
  message queue.
UnlockMutex(M1)

notify Thread-B
  of new Msg
-------------------       ---------------------
                          LockMutex(M1)
                          extract pointer to Msg from
                            queue.
                          UnlockMutex(M1)

                          read contents of Msg
                          (note: Thread-B only *READS*
                           the contents of Msg)

问:如果' M1'是一个通用的互斥锁,是Thread-B 总是保证有正确的内容' Msg'什么时候使用C ++或C来实现软件? 问:对于某些操作系统和/或处理器配置组合,此模式是否无法正常工作? (主要关注Linux,Windows,Mac OS X,VxWorks,Green Hills和Micrium等操作系统)

我的理解(可能是不正确的)是通过锁定和/或解锁互斥锁' M1'来实现的关键部分。将导致执行内存屏障/ fence指令,这将确保处理器/核心缓存的一致性;因此,Thread-B保证读取正确的内容' Msg'。但是,我在查找权威文档方面遇到了一些困难,这些文档表明了上述"一般模式"是对的。

1 个答案:

答案 0 :(得分:0)

在一般意义上,所描述的“消息传递模式”对于所有平台都是 NOT “线程安全”;但是,对于某些平台(例如具有强大缓存一致性的单处理器,或具有强大缓存一致性的某些多核处理器,例如Intel / AMD x86-64),上述模式将起作用......但应该避免到期不符合C ++ 11内存模型。