我如何显示易失性分配不是原子的?

我明白分配可能不是原子在 C。我试图触发一个比赛条件来显示这一点。 然而,我下面的代码似乎没有触发任何这样的。我怎样才能改变它,使它最终会触发一个竞争条件? # 包含 # 包含 易失性 uint64_t sharedValue = 1; Const uint64_t 值 1 = 13; Const uint64_t 值 2 = 1414; 空写 () { Bool even = true; 对于 (;;) { Uint64_t 值; 如果 (偶数) 值 = 值 1; 否则 值 = 值 2; SharedValue = value; 偶数 =!甚至; } } Void read () { 对于 (;;) { Uint64_t 值 = 共享值; 如果 (值!= 值 1 & & 值!= 值 2) { Std:: cout <<"比赛条件!值: "<<值 <<std:: endl <<std:: flush; } } } Int main () { Std:: 线程 t1 (写入); Std:: 线程 t2 (读取); T1.join (); } 我使用 VS 2017 和编译版本 x86。 以下是 ……

共4个回答,已解决, 标签: c++ x86 atomic race-condition stdatomic
将指向原子类型的指针分配给非原子类型的指针

此代码的行为是否定义良好? #include const int test = 42; const int * _Atomic atomic_int_ptr; atomic_init(&atomic_int_ptr, &test); const int ** int_ptr_ptr = &atomic_int_ptr; printf("int = %d\n", **int_ptr_ptr); //prints int = 42 -------------------------------------------------------------------------------- 我将指向原子类型的指针分配给非原子类型的指针 (这些类型是相同的)。以下是我对此示例的想法: 《标准》明确指定 const volatile restrict 了限定符的区别和限定符 _Atomic 6.2.5(p27) : > 只要允许类型的原子版本以及类型的其他限定版本, 本标准就显式使用短语 "原子、限定或不合格类型"。"限定或不合格类型" 一词, 没有具体提及原子, 不包括原子类型。 此外, 限定类 ……

共2个回答,已解决, 标签: c concurrency language-lawyer c11 stdatomic
保证逻辑和表达式中的函数调用 [复制]

这个问题在这里已经有答案了: 逻辑和或: 从左到右的评估有保证吗? [/questions/5683026/logical-and-or-is-left-to-right-evaluation-guaranteed](1 回答) 带有逻辑运算符的子表达式的求值顺序 [/questions/31101327/c-order-of-evaluation-of-subexpressions-with-logical-operators] (2 个答案) 昨天关门了。 我正在使用 C 原子重构一些代码。代码如下所示: Std:: atomic someFlag {};//这可以使用公共方法设置为 true //... Const bool cond1 {someFunction ()}; Const bool cond2 {otherFunction ()}; 如果 (someFlag.load ()) { SomeFlage.store (假); 如果 (cond1 & & cond2) { PerformSomeAction (); } } 我目前正计划重写if像这样的语句: 如果 (st ……

共2个回答,已解决, 标签: c++ atomic stdatomic
为什么 std:: 原子构造函数在 C 14 和 C 17 中表现不同

我在 C 11 的一个项目中工作,我尝试了以下代码 # 包括 结构 A { Std:: atomic_int idx = 1; }; Int main () { 返回 0; } 我得到编译器错误 错误: 使用删除的函数 “std:: atomic_base <_ IntTp>:: atomic_base (const std:: atomic_base <_ IntTp> &) [与 _ ITp = int]' Std:: atomic_int idx = 1; ^ 同样的结果是 C 14。当我切换到 C 17 时,它工作:Wandbox [https://wandbox.org/permlink/Fa6J9GdjCUvMosdQ] 我检查了 cppreference 的差异: * std::atomic [https://en.cppreference.com/w/cpp/atomic/atomic] * std::atomic::operator= [https://en.cppreference.com/w/cpp/atomic/atomic/operator=] * ……

共1个回答,已解决, 标签: c++ c++14 c++17 stdatomic