我有一些代码,通过首先清除目标 int 中的掩码位,然后将它们或运算到 int 中,将掩码位复制到整数中。
像这样:
bitsToSet = 6
targetInt &= ~(1 << bitsToSet)
targetInt |= desiredBitValue << bitsToSet
Run Code Online (Sandbox Code Playgroud)
问题是它现在需要是线程安全的,并且我需要使操作原子化。我认为使用 std:atomic<int> 只会使每个子操作成为原子操作,而不是整个操作。
如何使整个操作(包括 &= 和 |= 操作)原子化?
例如,如果我有一个函数(或者更好的是宏),SetBits(TARGET, MASK, VALUE)它可以自动将 TARGET 中的 MASKed 位设置为 VALUE,那么它就会为我解决问题。MASK 和 VALUE 已经可以左移。
我当前的非原子代码是
#define SetBits(TARGET, MASK, VALUE) {(TARGET) &= ~((uint64_t)MASK); (TARGET)|=((uint64_t)VALUE);}
Run Code Online (Sandbox Code Playgroud)