gpt4 book ai didi

c++ - 成员函数中的静态变量可以是线程安全的吗?

转载 作者:行者123 更新时间:2023-12-01 14:39:16 28 4
gpt4 key购买 nike

我正在实现与here问题非常相似的东西。

Window::Window()
{
static bool flagInit = true;
if (flagInit)
{
doInit(); // doInit should be called only once.
flagInit = false;
}
createWindow()
}

我了解使用静态变量通常在多线程方面不是一个好主意。如果两个线程同时创建 Window实例,则 flagInit可能由于数据争用而无法工作。但是Singleton类也不会完成我的工作,因为我想创建该类的多个实例。
Window toolTip, mainWindow;

如果我在初始化部分添加互斥锁,这是否使其成为线程安全的?另外,这样做是一个好习惯吗?
Window::Window()
{
{
std::scoped_lock<std::mutex> lock(mutex);
static bool flagInit = true;
if (flagInit)
{
doInit(); // doInit should be called only once.
flagInit = false;
}
}
createWindow()
}

PS doInit()来自别人的图书馆,所以我无能为力

最佳答案

有一个专门用于此的工具: std::call_once :

class Window
{
static std::once_flag flagInit;
// ...
};

Window::Window()
{
std::call_once(flagInit, doInit); // Note: can throw
createWindow();
}

从技术上讲,由于C++ 11使它们的初始化成为线程安全的,因此您仍然可以使用静态方法来完成此操作:
Window::Window()
{
static bool flagInit = (doInit(), false);
createWindow()
}

关于c++ - 成员函数中的静态变量可以是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62317531/

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