1

你如何原子地设置一个字节的位?我要解决的问题涉及更新大量字节数组,例如 uchar data[262144]。我使用 SET(index,value) 一次只设置一个字节的 2 位,这意味着四个线程可以同时在一个字节中设置值。线程选择相同的字节进行更新是非常罕见的,但确实会发生。使这些操作线程安全的最有效方法是什么?请注意,我不能为每个数据条目使用一个锁,这会太大太慢。

更糟糕的是,有时另一个字节数组 data1[131072] 也需要以线程安全的方式与先前的数据同时更新。但我计划合并这两个数组以简化问题,因此更新第一个数组的原子方式就足够了。

4

1 回答 1

3

您必须使用 CompareExchange 原语。你到底需要写什么,取决于编译器和平台。但是,理论上,它看起来像下面这样。

假设 CompareExchange 返回 oldvalue 并仅在 oldvalue 未更改时自动更改 value。

    做 {
        旧值 = 位集;
        新值 = 旧值|位值;
    } while ( oldvalue != CompareExchange(&bitset,newvalue,oldvalue) );

由于 CompareExchange 是原子的,它将自动设置位。但是您只能在最大一个处理器字大小的位集中自动设置位。

于 2013-10-20T19:45:19.577 回答