问题标签 [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.
c++ - 两个线程共享变量 C++
所以我有两个线程,它们共享相同的变量“计数器”。我想通过仅在两个线程都达到该点后继续执行来同步我的线程。不幸的是,我进入了死锁状态,因为我的线程没有改变它的检查变量。我的方式是:
这个想法是,由于我有 2 个线程,一旦它们到达那个点 - 在不同的时间 - 它们将增加计数器。如果计数器不等于 2,那么首先到达那里的线程将不得不等待,直到另一个线程增加了计数器,以便它们同步。有谁知道问题出在哪里?
为了添加有关该问题的更多信息,我有两个线程对数组执行一半的操作。一旦他们完成,我想确保他们都完成了他们的计算。一旦它们是,我可以通知打印机线程唤醒并执行它的打印和清除阵列的操作。如果我在两个线程完成之前这样做,就会出现问题。
伪代码:
arrays - 静态标准::原子bar[CONSTANT_BAZ],是否已初始化?
我在全局范围内有一组原子指针。这些是否初始化为 nullptr,或者是否有必要手动执行此操作,例如
multithreading - 标准::原子: Visual Studio 2013 (VC12) 中的访问冲突写入位置 0xFEEEEFEEE - 使用 std::atomic 时不会发生
以下在调试模式下为 x64 编译并在 Visual Studio 2013 调试器中运行的最小代码示例产生一个
... 处未处理的异常:访问冲突写入位置 0xFEEEFEEE。
调试时,我看到访问冲突发生在“return 0”;陈述。
(当在没有调试器的情况下从控制台运行时,错误显示为“0x 处的指令……引用了 0xddddddd 处的内存……无法写入内存。”)。
c++ - 如何在编写其他 std::atomic 后强制读取 std::atomic?
我有两个线程,生产者和消费者。数据交换由 std::atomics 内的两个指针控制:
线程生产者发布准备好的数据,然后检查等待的值:
waiting
至关重要的是,在 store on 之后加载 onnext
,但std::memory_order_seq_cst
它的保证比我真正需要的要强得多,因为我真的只需要固定这两个访问的顺序。是否可以在不需要的情况下获得我需要的内存顺序memory_order_seq_cst
?
这是图片的其余部分:
线程消费者检查next
。如果它发现它是空的,它waiting
会在阻塞自己之前向 Producer 发出信号。
整个事情是一个生产者 - 消费者队列,无需所有复杂的机制即可保持低锁定需求。next
实际上是在单链表的当前节点内。数据通常是突发的,因此在大多数情况下,消费者会发现一大堆节点可供消费;除了极少数情况外,两个线程都只在突发之间经历一次锁定和阻塞/唤醒。
c++ - 分配是否等同于 std::atomic 的加载/存储
我看到这可能有问题我必须明确调用原子加载/存储吗?.
因此,为了清楚起见,我将简洁地重申我的问题,希望未来的读者能明白这一点。
是
如同
和
如同
如果确实如此,那么:
- 为什么有2个选项?有什么明显的好处?
- 在处理原子时,最好使用更详细的 load()/store() 而不是可能令人困惑的 assignment(=),这可能意味着取决于 LHS 还是 RHS 是原子的。
注意我已经知道这两个变量不能是 std::atomic 即 LHS 和 RHS,因为不可能在一条指令中原子地读写。
c++ - 可以使用 std::atomic 内存屏障在线程之间传输非原子数据吗?
是否符合以下代码标准?x
(或者可以在不原子化的情况下使其符合要求volatile
吗?)
这类似于之前的问题,但是我想引用 C++ 标准的相关部分。
我担心的是原子store()
并且load()
没有为非原子变量(x
在下面的示例中)提供足够的编译器障碍以正确释放和获取语义。
我的目标是实现无锁原语,例如队列,它可以在线程之间传输指向常规 C++ 数据结构的指针。
c++ - 按需条件 std::atomic_thread_fence 获取的优缺点?
下面的代码显示了通过原子标志获取共享状态的两种方法。读取器线程调用poll1()
或poll2()
检查写入器是否已发出标志。
投票选项#1:
投票选项#2:
请注意,选项 #1在较早的问题中提出,选项 #2 类似于cppreference.com 上的示例代码。
假设读者同意仅在poll
函数返回时检查共享状态true
,这两个poll
函数是否正确且等价?
选项#2 有标准名称吗?
每个选项的优点和缺点是什么?
选项#2 在实践中可能更有效吗?是否有可能降低效率?
这是一个完整的工作示例:
c++ - 静态库中对 c++11 atomic 的未定义引用
使用我事先在项目中创建的静态库时遇到问题。这个静态库使用c++11 atomic。一切都编译得很好,我的静态库就创建好了。但是,当我尝试在另一个项目中使用它时,在链接时出现以下错误:
其中 Compound.cpp.o 是库的目标文件的时间。这是我用来创建库的 Makefile:
对此有什么想法吗?
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 语句内的任何加载之前发生。
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 实现的怪癖。
谢谢