【问题标题】:atomic set bits in array of bytes字节数组中的原子集位
【发布时间】:2013-10-20 15:19:25
【问题描述】:

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

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

【问题讨论】:

  • 是否可行,例如,为每个线程维护一个单独的数据副本,然后在最后合并?
  • 很遗憾没有。大多数情况下,线程访问其分区中的数据,但它们也会访问和更新其他分区。
  • 如果“其他分区”更新只是偶尔的,那么请求所有者线程进行更新怎么样?这可能具有较低的摊销成本。
  • 是的,我考虑过利用该地区,作为最后的手段。
  • 或者你可以每个分区使用一个锁,不是吗?通常,您可以通过散列对象索引并使用散列选择锁来减少对象数组中的锁争用;这使您可以动态调整锁的数量。

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多