字节数组中的原子设置位

时间:2013-10-20 15:19:25

标签: c multithreading locking atomic compare-and-swap

如何自动设置一个字节的位?我试图解决的问题涉及更新大量字节,比如uchar数据[262144]。我使用SET(索引,值)一次只设置一个字节的2位,这意味着四个线程可以同时在一个字节中设置值。线程选择相同的字节进行更新是非常罕见的,但它确实发生了。使这些操作线程安全的最有效方法是什么?请注意,我不能对每个数据条目使用锁定,这个锁定太大太慢。

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

1 个答案:

答案 0 :(得分:3)

您必须使用CompareExchange原语。您需要编写什么,取决于编译器和平台。但是,从理论上讲,它看起来如下。

假设只有在未更改oldvalue时,CompareExchange才会返回oldvalue并以原子方式更改值。


    do {
        oldvalue = bitset;
        newvalue = oldvalue|bitvalue;
    } while ( oldvalue != CompareExchange(&bitset,newvalue,oldvalue) );

由于CompareExchange是原子的,它将以原子方式设置位。但是,您可以仅在最大一个处理器字大小的位集中以原子方式设置位。