我担心在没有unique_ptr
的情况下使用mutex
进行多线程处理。我在下面写了简化代码,请看一下。如果我检查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));
}
}
答案 0 :(得分:2)
如果我检查
unique_ptr != nullptr
,它是否是线程安全的
不,它不是线程安全的。如果您有多个线程并且其中至少有一个线程写入共享数据,那么您需要同步。如果不这样做,那么您将遇到数据竞争,并且它是未定义的行为。
m_bigClass.reset(new BigClassCreatedOnce()); // created only once
和
if (!m_bigClass)
两者都可以同时发生,所以这是一场数据竞赛。
我还想指出
if (m_bigClass->var.load())
也不是线程安全的。 var.load()
是m_bigClass
,但 preprocessors: {
"**/*.component.js": ["generic"]
},
的访问权限并非如此,您也可以在那里进行数据竞争。