gpt4 book ai didi

c++ - std::call_once 对非原子变量安全吗?

转载 作者:可可西里 更新时间:2023-11-01 16:35:22 28 4
gpt4 key购买 nike

对于非原子变量,std::call_once 会正常工作吗?考虑以下代码

std::once_flag once;
int x;

void init() { x = 10; }

void f() {
std::call_once(once, init);
assert(x == 10);
}

int main() {
std::thread t1(f), t2(f);
t1.join();
t2.join();
}

call_once 返回时,init 中的副作用会被所有线程看到吗?关于 cppreference 的文档有点模糊。它只说在所有线程上 std::call_once 将在 init 完成后返回,但没有提及任何阻止 x=10 在 init 之后重新排序的内容 返回。

有什么想法吗?澄清行为的标准在哪里?

最佳答案

Will the side-effect in init be seen to all threads when call_once returns?

init 的副作用对于所有调用过 call_once 的线程都是可见的不超过一次主动执行(调用 init),但可以进行多次被动执行。

§ 30.4.6.2-2 - [thread.once.callonce]

An execution of call_once that does not call its func is a passive execution. An execution of call_once that calls its func is an active execution.

§ 30.4.6.2-3 - [thread.once.callonce]

Synchronization: For any given once_flag: all active executions occur in a total order; completion of an active execution synchronizes with (6.8.2) the start of the next one in this total order; and the returning execution synchronizes with the return from all passive executions.

果然如你所愿

关于c++ - std::call_once 对非原子变量安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48221492/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com