我有一些恐惧使用多线程unique_ptr
没有mutex
。我在下面写了简化代码,请看看。如果我检查unique_ptr != nullptr
,它是否安全?unique_ptr与多线程
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));
}
}
为什么不在'm_bigClass'设置后创建线程? –
如果我这样做,评论“m_bigClass的访问不是这样,你也可以在那里有一个数据竞赛。”据我了解,这也不能解决这种情况? –