gpt4 book ai didi

c - 使用标志在线程之间进行通信

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:05 24 4
gpt4 key购买 nike

在网上,可以找到很多关于在并行编程中使用volatile关键字的争论,有时甚至是自相矛盾的。

关于这个主题的一个更值得信赖的讨论似乎是 this article by Arch Robison .他使用的示例是将一个值从一个线程传递到另一个线程的任务:

线程 1. 计算矩阵乘积并将其提供给线程 2,线程 2 用它做一些其他事情。矩阵是变量 M,标志是 volatile 指针 R

  1. Thread 1 multiplies computes a matrix product M and atomically sets R to point to M.
  2. Thread 2 waits until R!=NULL and then uses M as a factor to compute another matrix product.

In other words, M is a message and R is a ready flag.

作者声称,虽然将 R 声明为 volatile 将解决将更改从线程 1 传播到线程 2 的问题,但它不能保证发生这种情况时 M 的值是多少。 RM 的赋值可以重新排序。所以我们需要使 MR 都可变,或者在某些库(如 pthreads)中使用某种同步机制。

我的问题是,如何在 C 中执行以下操作

1) 如何在两个线程之间共享一个标志 - 如何自动分配给它,确保另一个线程将看到更改并测试另一个线程中的更改。在这种情况下使用 volatile 是否合法?或者某些库能否提供概念上更好或更快的方法,可能涉及内存障碍?

2) 如何正确执行 Robison 的示例,即如何将矩阵 M 从一个线程发送到另一个线程并安全地执行(最好使用 pthreads 可移植)

最佳答案

volatile为您提供零订购保证。在编译时(以及弱序 ISA 上的运行时),它类似于 _Atomicmemory_order_relaxed . (假设变量足够小并且足够对齐以自然地成为原子。

当然有 bool它只有 1 个字节发生了变化,所以除了 0 之外看到的都是或 1是不可能的。

在强序 x86 上的运行时,asm 加载/存储具有 acq/rel 排序,所以如果 volatile碰巧没有重新排序,那么它对于该构建是“安全的”。

When to use volatile with multi threading? (永远不要:如果您想要的话,请将 atomic 与 memory_order_relaxed 结合使用。)


对于“数据就绪”标志,您实际上需要发布/获取语义。 https://preshing.com/20120913/acquire-and-release-semantics/

How to share a single flag between two threads - How to atomically assign to it, make sure the other thread will see the change and test for the change in the other thread.

#include <stdatomic.h>
// shared:
_Atomic bool data_ready = false;
float shared_matrix[N][N];

在生产者中:

   write_matrix( &shared_matrix );  // loop that fills a buffer
atomic_store_explicit(&data_ready, true, memory_order_release);
// data_ready = true but with only release, not seq_cst for efficiency

在消费者中:

#include <immintrin.h>   // ifdef __x86__

void consumer() {
while(!atomic_load_explicit(&data_ready, memory_order_acquire)) {
_mm_pause(); // for x86 spin loops
}
// now safe to read matrix
}

关于c - 使用标志在线程之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9481821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com