问题标签 [stdatomic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1153 浏览

c++ - x86-64 movl and cmpl difference

Is cmpl instruction equivalent to movl + a compare. If so, what's the difference b/w: (1)

and: (2)

(1) is generated for while (!data_ready); where data_ready is volatile int data_ready = 0x0;

(2) is generated for while (!data_ready.load(std::memory_order_acquire)); where data_ready is std::atomic<int> data_ready(0x0);

In both cases data_ready is set to 1 by another thread. Intel guarantees movl to be atomic for aligned memory access and it seems like cmpl should be atomic too. If that's the case why is clang generating different codes? (I am sure there is valid reasons that's why I am asking)

Also, does this mean that a volatile variable is "equivalent" to an std::atomic on x86-64 platforms (which means nothing of course and is not guaranteed by the C++ standard).

The code that generates this is available in this github repo

0 投票
1 回答
1531 浏览

c++ - fetch_sub 真的是原子的吗?

我有以下代码(用 C++ 编写):

StringRef 类中的代码:

InternedString 中的代码:

当我在多个线程中执行此代码时,deleteFromParent() 会为同一个对象多次调用。我不明白为什么......即使我过度释放我仍然不应该得到这种行为,我想......

有人可以帮助我吗?我究竟做错了什么?

0 投票
1 回答
188 浏览

exception - 了解为什么只有一个线程执行写操作时会发生竞争条件

我最近问“抛出的对象不能在多线程解决方案中被捕获”并得到了完美的正确答案。但是,我仍然很困惑为什么只有一个线程执行写操作时会出现竞争条件。让我粘贴原始有问题的代码:

有时输出只是

根据链接的问题,如果我改为使用 member atomic<bool> alive_,则输出变为预期

现在,我试图解释为什么成员bool alive_会导致未定义的行为。

案例1(快乐结局):

  • 变量solution被初始化:
    • solution_using_thread的默认构造函数在主线程中设置alive_为。true
    • 线程启动并且 的值alive_恰好true在第二个线程中。所以线程执行卡在while循环中。
    • 在构造函数返回之前,第二个线程已经启动。
  • 我们throw 1
    • 的析构函数solution被调用。的值alive_true主线程中。
    • thread.join()阻塞,直到 的值alive_与第二个线程同步。
    • 在同步了一些有限的延迟之后alive_,while 循环终止,第二个线程结束,thread_.join()返回和堆栈展开愉快地完成。
  • 输出是0 1 2

情况 2(不需要,但至少不是“未定义行为”):

  • 变量solution被初始化:
    • solution_using_thread的默认构造函数在主线程中设置alive_为。true
    • 线程启动并且 的值alive_恰好false在第二个线程中。所以线程执行立即结束。
    • 在构造函数返回之前,第二个线程已经启动。
  • 我们throw 1
    • thread.join()立即返回,因为线程已经完成。
  • 输出是0 1 2

显然,至少还有一种情况,它只打印0. 你能描述一下那个案例吗?

0 投票
1 回答
2470 浏览

c++ - std::atomic 怎么来的用clang编译时没有实现?

考虑以下代码:

G++ 编译它就好了,而 clang++ 产生以下内容:

他们不链接到同一个标准库吗?

0 投票
0 回答
238 浏览

c++ - 从向量中删除具有原子布尔值的类

我有一个类事务的向量,并尝试使用以下代码删除一定范围的元素。编译时出现错误:
“错误:使用已删除的函数'std::atomic_bool& std::atomic_bool::operator=(const std::atomic_bool&)”删除具有原子布尔成员的类的正确方法是什么?

其中事务是我的类事务的向量

0 投票
1 回答
14123 浏览

c++ - 错误 C2280:试图引用已删除的函数(原子)

我有一个类型class A为 的成员变量。_atomicVarstd::atomic<int>

如果我构建项目,我会收到以下错误:

我主要是 C# 开发人员,所以我还不了解 C++ 的每一个细节。我不知道我在哪里使用atomic<int>.
我也尝试初始化_atomicVar

......但这没有用。
我希望_atomicVar(没有显式初始化)将使用int.
你能告诉我为什么会出现这个错误吗?

0 投票
0 回答
781 浏览

c++ - 标准::原子fetch_and() 和 fetch_or() 实现

C++11 doc 定义std::atomic::fetch_or()std::atomic::fetch_and()仅适用于 Integral 类型。这样,MSVC++ 2012就没有实现这个功能。有谁知道为什么?std::atomic<bool>

我只找到了这个解决方案。实现std::atomic_fetch_or<bool>和的专业化std::atomic_fetch_or<and>

不幸的是,它使用起来很不方便,就好像它是一个内置的运算符一样。

0 投票
0 回答
1329 浏览

c - C11 use of _Atomic with char*

Using C11 I'm looking to fetch the contents of a char* atomically, and was wondering what the best way to go about doing that was. I've defined a variable like so: _Atomic char* str;, but attempting to load the value atomic_load(&str); results in a compiler error Address argument to atomic operation must be a pointer to _Atomic type ('_Atomic(char) **' invalid)

I'm aware that C11's Atomic implementation allows for the declaration of Atomic char's, but how do I go about dealing with malloc'd char* pointers?

0 投票
2 回答
333 浏览

c++ - C++11 中的内存排序是关于主内存刷新排序的吗?

我不确定我是否完全理解(我可能完全错了)C++11 中的原子性和内存排序的概念。让我们看这个简单的单线程示例:

在这个单线程代码中,如果 a 和 b 不是原子类型,编译器可能会以在汇编代码中的方式重新排序指令,例如,在移动指令之前,我有一条移动指令将 10 分配给 'b'将 16 分配给“a”。所以对我来说,作为原子变量,它保证我在“b 移动指令”之前有“a 移动指令”,正如我在源代码中所说的那样。在那之后,有处理器和他的执行单元、预取指令和他的乱序框。并且该处理器可以在“a指令”之前处理“b指令”,无论汇编代码中的指令顺序是什么。

据我了解,这就是内存排序模型出现的地方。从那一刻起,如果我让默认模型顺序一致。可以保证我在主内存中清除这些值(10 和 16)将尊重我在源代码中存储的顺序。这样处理器将开始刷新寄存器或高速缓存,其中 16 存储到主存储器中以更新“a”,然后它将刷新主存储器中的 10 以用于“b”。

所以这种行为确实让我明白,如果我使用宽松的记忆模型。只有最后一部分不能保证,因此主内存中的刷新可能完全无序。

抱歉,如果您阅读我的内容有困难,我的英语仍然很差。但是谢谢你们的时间。

0 投票
0 回答
524 浏览

c++ - 正确的原子内存顺序,当 2 个线程更新相同的原子变量并且都使用条件中的值时(C++11)

我有一个具有最小值和最大值的原子整数变量。两个线程更新变量,一个增加它,另一个减少它。如果递增会使值超过最大值,则线程阻塞并等待条件变量。当值达到最小值时,减量也会发生同样的事情。当值递减并且旧值是最大值时,递减线程应该通知递增线程,并且在递增时应该以相反的方式发生同样的事情。

递减函数体:

我应该使用哪些内存顺序进行这些检查?我当前的实现似乎导致死锁......

编辑:将所有内存顺序更改为 std::memory_order_seq_cst 似乎并没有解决问题。