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;
将始终是原子读取-修改-写入操作。
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;
将始终是原子读取-修改-写入操作。