![]() |
1
3
对否则,pthread_create就没有意义充当内存同步(屏障)。 (这是一个问题,posix没有明确说明( nor does posix define a standard memory model ), 所以你必须决定你是否信任你的实现做它可能做的唯一明智的事情——在新线程运行之前确保同步——我不会特别担心)。
不,上下文开关不会起到屏障的作用。
由于pthread_create必须执行内存同步,因此这不会发生。任何驻留在另一个内核上的cpu缓存中的旧内存都必须失效。(幸运的是,常用的平台是缓存一致的,所以硬件会处理这一点)。 现在,如果您更改对象 之后 你已经创建了你的2。线程,您需要再次进行内存同步,以便所有各方都能看到更改,否则将避免竞争条件。pthread互斥体通常用于实现这一点。 |
![]() |
2
1
缓存一致性体系结构从体系结构设计的角度保证,即使是在访问内存位置时具有独立内存通道的分离CPU(ccNUMA-缓存一致性非统一内存体系结构),也不会导致示例中描述的不一致性。 这是一个重要的惩罚,但应用程序将正常运行。 线程#1在CPU0上运行,并将对象内存保存在缓存L1中。当CPU1上的线程#2读取相同的内存地址(或者更准确地说:相同的缓存行-查找 虚假分享 有关详细信息),它强制CPU0上的缓存未命中 在加载缓存行之前 . |
![]() |
3
0
你已经放弃了保证
它不可能与现有线程建立这样的关系。考虑两个线程,一个调用
正在创建线程:
创建的线程:
现在,这是一个连贯的保证——创建的线程必须看到
现在,让我们尝试使用一个不相关的线程: 正在创建线程:
不相关线程:
即使标准想要提供保证,我们还能有什么保证?由于线程之间没有同步,我们还没有尝试在关系之前实现逻辑发生。因此,标准不能尊重它——没有什么值得尊重的。没有特定的行为是“正确的”,因此标准无法向我们承诺正确的行为。
这同样适用于其他功能。例如
|
![]() |
Namit Patel · 如何将数组作为返回值传递给线程? 7 年前 |
![]() |
Davi Wesley · 对线程使用参数 7 年前 |
![]() |
Jay Wang · 生产者/消费者实施:陷入消费者循环 7 年前 |
![]() |
Razonixx · 从线程内增加全局计数器变量,而不必等待每个线程 7 年前 |
![]() |
MohammadReza Vahedi · 返回响应后运行函数 7 年前 |
![]() |
AshR · 程序断断续续地使用main报告与线程本身不同的线程id 7 年前 |
![]() |
filo · 如何在x86上使用gcc强制执行内存排序 7 年前 |