【发布时间】:2020-03-28 15:30:01
【问题描述】:
这是一个 C++17 sn-p,其中一个线程等待另一个线程到达某个阶段:
std::condition_variable cv;
std::atomic<bool> ready_flag{false};
std::mutex m;
// thread 1
... // start a thread, then wait for it to reach certain stage
auto lock = std::unique_lock(m);
cv.wait(lock, [&]{ return ready_flag.load(std::memory_order_acquire); });
// thread 2
... // modify state, etc
ready_flag.store(true, std::memory_order_release);
std::lock_guard{m}; // NOTE: this is lock immediately followed by unlock
cv.notify_all();
据我了解,这是使用原子标志和条件变量来实现目标的有效方法。例如这里不需要使用std::memory_order_seq_cst。
是否可以进一步放宽此代码?例如:
- 也许在
ready_flag.load()中使用std::memory_order_relaxed - 也许使用
std::atomic_thread_fence()而不是std::lock_guard{m};
【问题讨论】:
-
我认为你根本不需要 std::atomic 因为你在锁里面。但是,您需要在锁内设置标志
-
您是否衡量了自己的表现并发现了瓶颈?
-
@bertubezz,由于与此问题无关的某些原因,我需要标志是原子的。
-
@jtbandes,目的是尽可能放宽逻辑,同时保持 C++ 内存模型的约束。性能无关紧要
-
@bertubezz 在线程 2 中,
ready_flag在锁外设置为true。
标签: c++ multithreading c++17