如何自动设置一个字节的位?我试图解决的问题涉及更新大量字节,比如uchar数据[262144]。我使用SET(索引,值)一次只设置一个字节的2位,这意味着四个线程可以同时在一个字节中设置值。线程选择相同的字节进行更新是非常罕见的,但它确实发生了。使这些操作线程安全的最有效方法是什么?请注意,我不能对每个数据条目使用锁定,这个锁定太大太慢。
更糟糕的是,有时另一个字节数组data1 [131072]也需要以线程安全的方式与先前的数据同时更新。但我计划合并这两个数组以简化问题,因此更新第一个数组的原子方法就足够了。
答案 0 :(得分:3)
您必须使用CompareExchange原语。您需要编写什么,取决于编译器和平台。但是,从理论上讲,它看起来如下。
假设只有在未更改oldvalue时,CompareExchange才会返回oldvalue并以原子方式更改值。
do { oldvalue = bitset; newvalue = oldvalue|bitvalue; } while ( oldvalue != CompareExchange(&bitset,newvalue,oldvalue) );
由于CompareExchange是原子的,它将以原子方式设置位。但是,您可以仅在最大一个处理器字大小的位集中以原子方式设置位。