gpt4 book ai didi

multithreading - std::call_once 和函数级静态初始化有什么区别

转载 作者:行者123 更新时间:2023-12-03 14:06:31 24 4
gpt4 key购买 nike

1) std::call_once

A a;
std::once_flag once;

void f ( ) {
call_once ( once, [ ] { a = A {....}; } );
}

2) 函数级静态
A a;

void f ( ) {
static bool b = ( [ ] { a = A {....}; } ( ), true );
}

最佳答案

对于您的示例用法,hmjd 的回答完全说明没有区别(once_flag 案例中需要的额外全局 call_once 对象除外。)但是,call_once大小写更灵活,因为 once_flag对象不绑定(bind)到单个范围。例如,它可以是一个类成员并且被多个函数使用:

class X {
std::once_flag once;

void doSomething() {
std::call_once(once, []{ /* init ...*/ });
// ...
}

void doSomethingElse() {
std::call_once(once, []{ /*alternative init ...*/ });
// ...
}
};

现在根据首先调用哪个成员函数,初始化代码可能会有所不同(但对象仍然只会被初始化一次。)

因此,对于简单的情况,本地静态可以很好地工作(如果您的编译器支持),但有一些不太常见的用途可能更容易使用 call_once 实现.

关于multithreading - std::call_once 和函数级静态初始化有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17407553/

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