【发布时间】:2014-09-11 00:50:44
【问题描述】:
给定两个线程之间的通用消息传递模式:
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'是一个通用互斥体,当使用C++或C来实现软件时,Thread-B 总是是否保证有正确的'Msg'内容? 问:这种模式对于操作系统和/或处理器配置的某些组合是否不能正常工作? (我主要关注 Linux、Windows、Mac OS X、VxWorks、Green Hills 和 Micrium 等操作系统)
我的理解(可能不正确)是通过锁定和/或解锁互斥锁“M1”实现的关键部分将导致执行内存屏障/栅栏指令,这将确保处理器/核心缓存的一致性;因此 Thread-B 保证读取 'Msg' 的正确内容。但是,我很难找到表明上述“一般模式”是正确的权威文档。
【问题讨论】:
-
内存模型是编程语言的一个属性(或者在较低级别,是 CPU 的一个特性)。这个问题只能在特定内存模型的上下文中回答,因此在目前的形式下是无法回答的。
-
我认为要回答您的问题,您必须知道 CPU 的类型,即“弱”与“强”内存模型,然后您的代码使用的是哪个运行时。尽管如果您使用的是 Java,JVM 在所有架构中都有一个非常具体的内存模型,这让我相信 CPU 类型对您的问题并不重要。
-
@Ken Mumme:您想要的权威文档是C or C++ standard(分别)。在
C11中,相关部分是5.1.2.3和5.1.2.4(内存模型),以及7.17和7.26(标准库组件)。在C++11中,相关部分是1.9和1.10(内存模型),以及29和30(标准库组件)。总的来说,这个问题太宽泛了; C 和 C++ 是不同的语言,您问题中的伪代码可以有多种解释方式。
标签: multithreading memory mutex barrier