繁体   English   中英

同时修改整数位

[英]concurrent modification of bits in a integer

我想知道我是否尝试从多个线程设置char / integer内部的位,是否会丢失任何修改? 最初,我将全为零,线程只会将其设置为1。系统体系结构是x64。

谢谢,高古

在x64(和x86)上,对int的操作是原子的。 这意味着读和写是独立的原子,而不是组合的。 (例如,如果您有两个线程同时写入一个int,您将看不到一半的一半和另一半的一半-您将始终看到一个完整的int或另一个完整的int。)

但是,读取和写入是两个单独的操作。 您可以执行一些互锁的操作(使读和写成为一个原子操作),但是我不相信按位逻辑属于可以这种方式执行的一组操作。

我想如果您希望此操作是原子操作,则必须锁定某些互斥体/监视器并执行读/写操作。

您必须使用互斥锁或类似的同步机制,或者使用原子操作。 对于前者,有POSIX和Windows库,它们很容易获得并且非常标准。 对于后者,大多数编译器将提供一些功能(例如, http : //gcc.gnu.org/wiki/Atomic ),内联汇编模式或其他方便的使用它们的方法,并且您总是可以退回到链接到已编译的对象从汇编语言开始。

您绝对无法避免这样的显式同步。 即使说XOR以某种方式直接和原子地对CPU内核最内部的内存缓存中的值进行操作(不是这样),您也需要确保该值与其他CPU内核的缓存同步。 仅那些显式同步缓存的CPU指令对您有用-通过上述库选项之一使用它们最简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM