c++ 我听说我不是线程安全,是线程安全吗?

我听说我不是一个线程安全的语句,因为在汇编中它减少到将原始值存储为某处的温度,递增它,然后替换它,这可能被上下文切换中断。

然而,我想知道我。就我可以告诉,这将减少到一个汇编指令,例如’add r1,r1,1’,并且由于它只有一个指令,它将是不可中断的上下文切换。

任何人都可以澄清?我假设一个x86平台正在使用。

最佳答案
你听说错了。很可能“i”对于特定的编译器和特定的处理器架构是线程安全的,但是在标准中并不是强制的。事实上,由于多线程不是ISO C或C标准(a)的一部分,你不能认为任何东西是线程安全的,基于你认为它会编译到什么。

这是相当可行的,我可以编译为任意序列,如:

load r0,[i]  ; load memory into reg 0
incr r0      ; increment reg 0
stor [i],r0  ; store reg 0 back to memory

这将不是线程安全在我的(虚)CPU没有内存增量指令。或者它可能是聪明的,编译成:

lock         ; disable task switching (interrupts)
load r0,[i]  ; load memory into reg 0
incr r0      ; increment reg 0
stor [i],r0  ; store reg 0 back to memory
unlock       ; enable task switching (interrupts)

其中锁禁用和解锁允许中断。但是,即使这样,在具有多个这样的CPU共享存储器的结构中(锁可以仅禁用一个CPU的中断),这可能不是线程安全的。

语言本身(或者它的库,如果它不是内置的语言)将提供线程安全的结构,你应该使用这些,而不是依赖于你的理解(或可能误解)将生成什么机器代码。

类似Java synchronized和pthread_mutex_lock()(在一些操作系统下可用于C/C++)是你需要查看(a)。

(a)在C11和C11标准完成之前提出了这个问题。这些迭代现在已经在语言规范中引入了线程支持,包括原子数据类型(尽管它们和线程通常是可选的,至少在C中)。

转载注明原文:c++ 我听说我不是线程安全,是线程安全吗? - 代码日志