gpt4 book ai didi

c++ - 如何在构造函数中正确使用 call_once()?

转载 作者:行者123 更新时间:2023-11-27 22:39:33 25 4
gpt4 key购买 nike

以下program尝试在构造函数中使用 call_once()。它是对Stroustrup在“CPL”,4中提供的示例的修改。

class X
{
private:
static int data;
static once_flag initdata_flg;

static void init();

public:
X()
{
call_once(initdata_flg, init);

cout << "** diagnostic: X::data initialized"
<< endl;
}

int getdata() const
{
return data;
}
};


/** class X static members ...
(static members must be defined
outside the class **/
int X::data;
once_flag X::initdata_flg;

void X::init()
{
data = 915;
}


/// declarations ...
void construct();

/// implementation ...

int main()
{
thread t1 {construct};
thread t2 {construct};

t1.join();
t2.join();
}

void construct()
{
X x;
}


输出结果如下:

** diagnostic: X::data initialized
** diagnostic: X::data initialized

诊断出现两次,而不是一次。显然,这不是在构造函数中正确使用 call_once() 的方法。

为此,我需要在 construct() 函数中使用 call_once()。那不是我想做的。我想在构造函数中使用call_once()。

这样做的正确方法是什么?

最佳答案

您是在构造函数中发出诊断,而不是在 init 中。当然构造函数会运行两次;它将始终为您创建的每个对象运行一次。但是,只有一个对 call_once 的调用会实际调用 init,您可以通过将诊断输出移到那里来验证这一点。

[Live example]

关于c++ - 如何在构造函数中正确使用 call_once()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50169289/

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