问题标签 [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 投票
3 回答
5740 浏览

c++ - 两个线程共享变量 C++

所以我有两个线程,它们共享相同的变量“计数器”。我想通过仅在两个线程都达到该点后继续执行来同步我的线程。不幸的是,我进入了死锁状态,因为我的线程没有改变它的检查变量。我的方式是:

这个想法是,由于我有 2 个线程,一旦它们到达那个点 - 在不同的时间 - 它们将增加计数器。如果计数器不等于 2,那么首先到达那里的线程将不得不等待,直到另一个线程增加了计数器,以便它们同步。有谁知道问题出在哪里?

为了添加有关该问题的更多信息,我有两个线程对数组执行一半的操作。一旦他们完成,我想确保他们都完成了他们的计算。一旦它们是,我可以通知打印机线程唤醒并执行它的打印和清除阵列的操作。如果我在两个线程完成之前这样做,就会出现问题。

伪代码:

0 投票
1 回答
111 浏览

arrays - 静态标准::原子bar[CONSTANT_BAZ],是否已初始化?

我在全局范围内有一组原子指针。这些是否初始化为 nullptr,或者是否有必要手动执行此操作,例如

0 投票
1 回答
770 浏览

multithreading - 标准::原子: Visual Studio 2013 (VC12) 中的访问冲突写入位置 0xFEEEEFEEE - 使用 std::atomic 时不会发生

以下在调试模式下为 x64 编译并在 Visual Studio 2013 调试器中运行的最小代码示例产生一个

... 处未处理的异常:访问冲突写入位置 0xFEEEFEEE。

调试时,我看到访问冲突发生在“return 0”;陈述。

(当在没有调试器的情况下从控制台运行时,错误显示为“0x 处的指令……引用了 0xddddddd 处的内存……无法写入内存。”)。

0 投票
3 回答
381 浏览

c++ - 如何在编写其他 std::atomic 后强制读取 std::atomic?

我有两个线程,生产者和消费者。数据交换由 std::atomics 内的两个指针控制:

线程生产者发布准备好的数据,然后检查等待的值:

waiting至关重要的是,在 store on 之后加载 onnext,但std::memory_order_seq_cst它的保证比我真正需要的要强得多,因为我真的只需要固定这两个访问的顺序。是否可以在不需要的情况下获得我需要的内存顺序memory_order_seq_cst

这是图片的其余部分:

线程消费者检查next。如果它发现它是空的,它waiting会在阻塞自己之前向 Producer 发出信号。

整个事情是一个生产者 - 消费者队列,无需所有复杂的机制即可保持低锁定需求。next实际上是在单链表的当前节点内。数据通常是突发的,因此在大多数情况下,消费者会发现一大堆节点可供消费;除了极少数情况外,两个线程都只在突发之间经历一次锁定和阻塞/唤醒。

0 投票
1 回答
6379 浏览

c++ - 分配是否等同于 std::atomic 的加载/存储

我看到这可能有问题我必须明确调用原子加载/存储吗?.

因此,为了清楚起见,我将简洁地重申我的问题,希望未来的读者能明白这一点。

如同

如同

如果确实如此,那么:

  1. 为什么有2个选项?有什么明显的好处?
  2. 在处理原子时,最好使用更详细的 load()/store() 而不是可能令人困惑的 assignment(=),这可能意味着取决于 LHS 还是 RHS 是原子的。

注意我已经知道这两个变量不能是 std::atomic 即 LHS 和 RHS,因为不可能在一条指令中原子地读写。

0 投票
1 回答
706 浏览

c++ - 可以使用 std::atomic 内存屏障在线程之间传输非原子数据吗?

是否符合以下代码标准?x(或者可以在不原子化的情况下使其符合要求volatile吗?)

这类似于之前的问题,但是我想引用 C++ 标准的相关部分。

我担心的是原子store()并且load()没有为非原子变量(x在下面的示例中)提供足够的编译器障碍以正确释放和获取语义。

我的目标是实现无锁原语,例如队列,它可以在线程之间传输指向常规 C++ 数据结构的指针。

0 投票
1 回答
271 浏览

c++ - 按需条件 std::atomic_thread_fence 获取的优缺点?

下面的代码显示了通过原子标志获取共享状态的两种方法。读取器线程调用poll1()poll2()检查写入器是否已发出标志。

投票选项#1:

投票选项#2:

请注意,选项 #1在较早的问题中提出,选项 #2 类似于cppreference.com 上的示例代码

假设读者同意仅在poll函数返回时检查共享状态true,这两个poll函数是否正确且等价?

选项#2 有标准名称吗?

每个选项的优点和缺点是什么?

选项#2 在实践中可能更有效吗?是否有可能降低效率?

这是一个完整的工作示例:

0 投票
1 回答
3277 浏览

c++ - 静态库中对 c++11 atomic 的未定义引用

使用我事先在项目中创建的静态库时遇到问题。这个静态库使用c++11 atomic。一切都编译得很好,我的静态库就创建好了。但是,当我尝试在另一个项目中使用它时,在链接时出现以下错误:

其中 Compound.cpp.o 是库的目标文件的时间。这是我用来创建库的 Makefile:

对此有什么想法吗?

0 投票
1 回答
1794 浏览

c++ - 在 x64 上使用非临时存储获取/释放语义

我有类似的东西:

和:

您可以很容易地想象acquire_load 和release_store 的实现,它使用带有load(memory_order_acquire) 和store(memory_order_release) 的原子。但是现在如果 release_store 是用 _mm_stream_si64 实现的,这是一种非临时写入,相对于 x64 上的其他存储没有排序?如何获得相同的语义?

我认为以下是最低要求:

并这样使用它:

和:

那是对的吗?我很确定这里绝对需要sfence。但是围栏呢?对于 x64,它是必需的还是简单的编译器屏障就足够了?例如 asm volatile("": : :"memory")。根据 x86 内存模型,负载不会与其他负载重新排序。因此,据我了解,只要存在编译器障碍,acquire_load() 必须在 if 语句内的任何加载之前发生。

0 投票
1 回答
435 浏览

c++ - 尽管数据与预期值匹配,compare_exchange_strong 仍失败

问题在于compare_exchange_strong返回 false,尽管基础数据等于expected. 例如:

data是一个 128 位的 POD。ptr.is_lock_free()返回真。这是以单线程方式测试的。cas_result永远是假的,cmp_results永远是真的。

编译使用 Intel 的 C++ 编译器,版本 16 更新 2。在 Linux 上,libstdc++ 版本 5.3.1。64 位二进制。
完全相同的代码在 Windows 上编译时可以正常工作,具有相同的 ICC16,但作为 32 位代码。这让我相信这是 stdlib 实现的怪癖。

谢谢