gpt4 book ai didi

c++ - unique_ptr 与多线程

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:51 25 4
gpt4 key购买 nike

我对在没有 mutex 的多线程中使用 unique_ptr 感到有些恐惧。我在下面写了简化代码,请看一下。如果我检查 unique_ptr != nullptr,它是线程安全的吗?

class BigClassCreatedOnce
{
public:
std::atomic<bool> var;

// A lot of other stuff
};

BigClassCreatedOnce 类实例只会创建一次,但我不确定在线程之间使用它是否安全。

class MainClass
{
public:
// m_bigClass used all around the class from the Main Thread

MainClass()
: m_bigClass()
, m_thread()
{
m_thread = std::thread([this]() {
while (1)
{
methodToBeCalledFromThread();
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
});

// other stuff here

m_bigClass.reset(new BigClassCreatedOnce()); // created only once
}

void methodToBeCalledFromThread()
{
if (!m_bigClass) // As I understand this is not safe
{
return;
}

if (m_bigClass->var.load()) // As I understand this is safe
{
// does something
}
}

std::unique_ptr<BigClassCreatedOnce> m_bigClass;
std::thread m_thread;
};

我只是将它放入无限循环中以简化示例。

int main()
{
MainClass ms;
while (1)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
}

最佳答案

If I check unique_ptr != nullptr, is it thread safe

不,它不是线程安全的。如果您有多个线程,并且其中至少有一个线程写入共享数据,则您需要同步。如果你不这样做,那么你就会发生数据竞争,这是未定义的行为。

m_bigClass.reset(new BigClassCreatedOnce()); // created only once

if (!m_bigClass)

两者可以同时发生,所以这是一场数据竞赛。

我还想指出

if (m_bigClass->var.load())

也不是线程安全的。 var.load() 是,但是 m_bigClass 的访问不是,所以你也可以在那里进行数据竞争。

关于c++ - unique_ptr 与多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44550929/

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