小编Ron*_*nen的帖子

std::condition_variable 的布尔谓词在 C++ 中应该是易失性的吗?

我听到了很多相互矛盾的答案,现在我不知道该怎么想。公认的知识是,为了在 C++ 中以线程安全的方式共享内存,需要将 volatilestd::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个选择:

  1. 必须使用 volatile 或 std::atomic
  2. 任何布尔值都可以
  3. 必须是 std::atomic

我想知道 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)

c++ multithreading std undefined-behavior c++11

4
推荐指数
1
解决办法
623
查看次数

标签 统计

c++ ×1

c++11 ×1

multithreading ×1

std ×1

undefined-behavior ×1