memory_order_seq_cst与其他内存顺序有什么不同?

what are the difference in memory_order_seq_cst with other memory order?

本文关键字:什么 顺序 其他 seq order cst memory 内存      更新时间:2023-10-16

是否有一个表来总结内存顺序的差异?例如在什么情况下使用每个内存顺序

此外,内存顺序和(data_cond and future)之间有什么区别?
is it 
1. memory order is for waiting
2. data_cond is for waiting 
3. future is for doing other thing while waiting

内存顺序用于指定原子操作中的内存顺序。最简单的内存顺序是memory_order_seq_cst,它提供了顺序一致性。其他内存模型给出宽松的内存顺序。

如果您想获得获取-释放顺序,您应该组合:memory_order_consume, memory_order_acquire, memory_order_releasememory_order_acq_rel .

如果你想获得一个宽松的排序,你应该使用memory_order_relaxed

下面是一个使用内存排序实现自旋锁互斥锁的简单示例:
class spinlock_mutex {
private:
  std::atomic_flag f;
public:
  spinlock_mutex() : f(ATOMIC_FLAG_INIT) {}
  void lock() {
    while (f.test_and_set(std::memory_order_acquire)) {}
  }
  void unlock() {
   flag.clear(std::memory_order_release());
  }
};

c++ 11中有data_cond类型。我想你可能指的是std::condition_variable,这是一个与互斥锁相关联的条件变量。

std::mutex m;
std::queue<request> q;
std::condition_variable cv;
void producer() {
  while (more_data()) {
    request r = generate_request();
    std::lock_guard<std::mutex> l(m);
    q.push(r);
    cv.notify_one();
  }
}
void consumer() {
  for (;;) {
    std::unique_lock<std::mutex> l(m);
    cv.wait(l, []{ return !q.empty();});
    request r = q.front();
    l.unlock();
    process_request(r);
    if (is_last(r)) break;
  }
}

最后,future允许线程向调用的代码段返回一个值。

int main() {
  std::future<int> r = std::async(do_something, 1, 10);
  do_something_else();
  std::cout << “Result= “ << r.get() << std::endl;
  return 0;
}