其他分享
首页 > 其他分享> > c – 是x;线程安全的?

c – 是x;线程安全的?

作者:互联网

如果我在一个线程中更新变量,如下所示:
receiveCounter;

然后从另一个线程我只读过这个变量并将其值写入GUI.

这样安全吗?或者这个指令可能在中间被中断,所以当另一个线程读取时,receiveCounter中的值是错误的?它必须如此正确,因为它不是原子的,它是几个指令.

我不关心同步读取和写入,它只需要递增然后在GUI中更新,但这不必直接在彼此之后发生.

我关心的是价值不能错.就像在中间被中断的操作一样,读取值完全关闭.

我需要锁定这个变量吗?我真的不想,因为它经常更新.我可以通过向MAIN线程发送消息并将值复制到队列(然后需要锁定但我不会在每次更新时都这样做)来解决这个问题.我想.

但无论如何,我对上述问题感兴趣.

解决方法:

它的核心是读 – 修改 – 写操作,它们不是原子的.周围有一些处理器有专门的指令.与Intel / AMD内核一样,它们非常常见,它们具有INC指令.

虽然这听起来像是原子的,因为它只是一条指令,但它仍然不是.与实际执行执行引擎的方式相比,x86 / x64指令集没有太多工作要做.其中执行类似RISC的“微操作”,INC指令被转换为多个微操作.可以使用指令上的LOCK前缀使其成为原子.但编译器不会发出它,除非他们知道需要进行原子更新.

因此,您需要明确它. C 11 std :: atomic<>标准添加是一个好方法.您的操作系统或编译器将具有内在函数,通常命名为“Interlocked”或“__built_in”.

标签:c,multithreading,atomicity
来源: https://codeday.me/bug/20190831/1777004.html