假设我有一个简单的单字节变量。我认为几乎所有系统的单字节操作都是原子的,但如果不是,请告诉我。现在,假设一个线程更新了这个变量。我应该期望/准备此更新多长时间出现在其他线程中?我知道我可以将更新放在互斥锁/锁定/屏障周围,以确保它在任何地方同步,但我对此很好奇。等待时间可能会有所不同,具体取决于其他线程是否位于不同的处理器/内核上,并且可能取决于处理器类型。
我是否合乎逻辑地想知道这件事,或者我误解了什么?
答案 0 :(得分:7)
一旦调用同步原语/内存屏障(例如pthread_mutex_lock
),内存就会同步。除此之外,除非使用C11原子类型,否则不应假设任何同步。
答案 1 :(得分:2)
在许多架构中,处理器不会刷新缓存,直到必须 - 为某些更需要的数据腾出空间。
但是,如果线程共享内存空间,和只有一个内核,他们将能够从缓存中“立即”看到更新。如果它实际上已经从CPU写入内存。如果编译器决定将其保存在寄存器中,则可能不是这样,在这种情况下,您的线程都将拥有自己的“本地”和不正确的副本。
正如其他人所说,这是一个有趣的问题 - 但同步的正确答案是使用正确的同步原语!
答案 2 :(得分:0)
在MIPS架构上有一条同步指令,它作为跨核心的加载存储屏障,即在发出同步之前的所有加载和存储将在任何加载之前发生并在同步之后存储。不确定x86中是否存在等效指令(假设这是您正在使用的架构。