我听到了很多相互矛盾的答案,现在我不知道该怎么想。公认的知识是,为了在 C++ 中以线程安全的方式共享内存,需要将 volatile与std::mutex 一起使用。
基于这种理解,我一直在编写这样的代码:
volatile bool ready = false;
std::condition_variable cv;
std::mutex mtx;
std::unique_lock<std::mutex> lckr{ mtx };
cv.wait(lckr, [&ready]() -> bool { return ready; });
Run Code Online (Sandbox Code Playgroud)
但后来我在 CppCon 上看到了 Chandler Carruth 的演讲,他说(作为旁注)在这种情况下不需要 volatile,而且我基本上不应该使用 volatile。
然后我在 Stack Overflow 上看到其他答案说永远不应该使用 volatile,而且它还不够好,而且根本不能保证原子性。
钱德勒·卡鲁斯正确吗?我们都错了吗?
现在我有3个选择:
我想知道 C++14 ISO 标准是否允许我编写如下代码:
#include <condition_variable>
#include <mutex>
#include <iostream>
#include <future>
#include <functional>
struct sync_t
{
std::condition_variable cv;
std::mutex mtx;
bool ready{ false };
};
static void threaded_func(sync_t& …Run Code Online (Sandbox Code Playgroud)