【问题标题】:How to doatomic CAS operation on two adjacent bits of a byte?如何对一个字节的两个相邻位进行原子 CAS 操作?
【发布时间】:2013-08-02 15:03:55
【问题描述】:

说有:

unsigned char byte = someValue;

我需要的是对byte 中的一些两个相邻位执行原子 CAS(比较和交换)操作,比如第四个和第五个。

当然,没有办法处理比字节短的东西,但是有一个字节的 CAS 函数,所以如下:

unsigned char expected = expectedValue;
unsigned char desired  =  desiredValue;
// atomic CAS operation for byte
__atomic_compare_exchange_n( &byte, &expected, desired, 0, std::memory_order_seq_cst, std::memory_order_seq_cst );

将自动比较byteexpected,如果它们相等,则将desired 分配给byte 并返回true,否则(即如果byte 不等于expected),它会将byte 分配给expected 并返回false

因此,如果它是对字节的 CAS 操作,其中比较不仅仅是通过检查 EQUALITY 来完成,而是通过一些按位操作,如按位与或按位或,那么就有可能对 CAS 进行位。

所以问题变成了是否存在字节的 CAS 操作,它在比较时不寻找相等性,而是寻找一些按位运算,如按位与或按位或?

【问题讨论】:

标签: gcc c++11 atomic bitmask compare-and-swap


【解决方案1】:

[是否存在]字节的 CAS 操作,在比较时,它不寻找相等性,而是寻找一些按位运算,如按位与或按位或?

在 C++ 中,唯一的比较和交换操作检查是否相等。所以答案是一个简单的

此外,我不知道有哪个 CPU 会以其他方式运行(尽管 可能属于微处理器 / DSP 类别,谁知道呢,有些可以做一些非常奇怪、专门的事情)。 p>

【讨论】:

  • 但也许有一些第三方库有这样的 CAS 操作,或者可能有一些汇编程序可以做到这一点,并且可以从 C++ 代码中调用?
  • @Vahagn 这就是我提到 CPU 的原因。所有主流 CPU 要么具有 CAS 操作,要么具有 Load/Store 语义。无论哪种方式,这都意味着比较平等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
相关资源
最近更新 更多