我有一些恐懼使用多線程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的訪問不是這樣,你也可以在那裏有一個數據競賽。」據我瞭解,這也不能解決這種情況? –