C原子读修改写

C atomic read modify write

C 中是否有任何函数可以执行原子读取-修改-写入? 我希望在单个原子块中读取一个值,然后将其设置为 0。

对于 C++,有 std::atomic::exchange() 这正是我要找的。 C 中是否有等效的东西?

代码如下:

void interruptHandler(void) {
    /* Callback attached to 3rd party device driver, indicating hardware fault */
    /* Set global variable bit masked flag to indicate interrupt */
    faultsBitMask |= 0x1;
}

void auditPoll(*faults) {
    *faults = faultsBitMask;
    /* !!! Need to prevent interrupt pre-empt here !!! */
    /* Combine these two lines to a single read-modify-write? */
    faultsBitMask = 0;
}

目标架构是 PowerPC。

感谢您的帮助!

如果您使用的是 GCC,请尝试 GCC builtin __atomic_exchange__atomic_compare_exchange_n

是的,<stdatomic.h> 头文件包含一个泛型函数 atomic_exchange,它与 C++ 版本非常相似:

_Atomic int n = 10;

#include <stdatomic.h>

int main(void) { return atomic_exchange(&n, 0); }

您似乎想将原子与信号处理程序结合使用。如果 C11 原子类型是 "lock-free",那么它们可以做到这一点,但通常它们是。您可以使用 ATOMIC_INT_LOCK_FREE.

int 测试此 属性

对于你的情况,你甚至不需要原子交换函数。在原子变量上

faultsBitMask |= 0x1;

将始终是原子读取-修改-写入操作。