我需要原子或互斥保护才能在 C++ 中的不同线程中进行顺序访问吗?

问题描述 投票:0回答:1

我有一个可用的x。 线程 1 读写 x。 然后线程 2 读写 x,这肯定会在线程 1 修改后发生。

int x;

void task(){
    ++x;
}

// 1. thread 1 runs task()
// 2. after 1 finished, thread 2 runs task()
// 3. goto 1 or 2

在这种情况下,线程肯定不会同时访问x,我是否需要使用原子或互斥来确保线程1的修改对线程2可见?

我猜这是 C++ 标准未定义的行为? 但在实际中它能正常工作吗?

我在阅读boost asio示例时遇到了这个问题。 异步接收操作在时间线上始终是连续的,但可以由不同的线程执行(尽管该示例仅使用一个工作线程)。我想知道接收处理程序中的普通(无原子或互斥)成员可修改是否可以正常工作。

c++ multithreading
1个回答
0
投票

通常,无论运行您的线程,这都是合法的。例如,

std::thread

std::thread::thread(func)
构造函数:

构造函数调用的完成与新执行线程上 f 副本的调用开始同步。

(粗体我的)

std::thread::join()


*this

 标识的线程的完成与 
join() 相应的成功返回同步。

(粗体我的)

请参阅

this

,了解我试图解释什么是“同步”。

想必 ASIO 也会这样做。

© www.soinside.com 2019 - 2024. All rights reserved.