我想知道我是否试图从多个线程中设置char/整数内部,我会失去任何修改吗?我最初将拥有所有零,并且线程仅将其设置为1。系统体系结构是x64。

谢谢,戈库尔。

有帮助吗?

解决方案

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

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

我认为,如果您希望此操作是原子,则必须锁定某些静音/监视器并执行读/写。

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top