C++/C 在单指令中检查和切换布尔值

C++/C check and toggle a bool in single instruction

提问人:Max Paython 提问时间:1/13/2022 最后编辑:Jarod42Max Paython 更新时间:1/13/2022 访问量:415

问:

我正在寻找一种 C++ 类型(或可能是 C)的方法,即在单个指令中检查(if 语句)和编辑。谷歌搜索让我无处可去,也许我使用了错误的关键字。boolintbool

例:

bool valid;
.
.
.
if(valid){
    valid = false;
    // do stuff
}

现在,我使用 ,但仍然和 是不同的指令,在多线程环境中,有一些东西介于两者之间。有没有办法在不使用互斥锁的情况下使这 2 个操作原子化?std::atomic<bool>if(valid)valid = false

我正在使用 GCC 11 / G++ 11。

C++ 逻辑布尔 值表达式

评论

3赞 Scheff's Cat 1/13/2022
std::atomic_compare_exchange()
2赞 Some programmer dude 1/13/2022
如果你用 C++ 编程,那么你就是在用 C++ 编程,而且只有 C++。请不要标记(或提及)其他不相关的语言。
4赞 HolyBlackCat 1/13/2022
ints 和 s 不是原子的(在 C 和 C++ 中),尝试从多个线程访问它们会导致 UB,无论位操作多么聪明。bool
1赞 Scheff's Cat 1/13/2022
线程之间的同步通信总是有一定的性能代价。您必须随时支付,否则会引入数据竞赛。AFAIK,原子是最便宜的线程同步。如果您没有使用多个线程(或者仅在一个线程中使用(读/写)有效),那么就保持原样......(忘掉原子)。
2赞 Lundin 1/13/2022
这与高级语言没有太大关系,但与底层 CPU 的能力有关。显然,如果没有可用的“检查和修改”指令,则无法在单个指令中完成此操作。没有可以重新设计 CPU ISA 的 C++ 库。

答: 暂无答案