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;
};
サンプルを簡略化するために無限ループに入れています。私はunique_ptr != nullptr
をチェックすると
int main()
{
MainClass ms;
while (1)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
}
なぜ 'm_bigClass'が設定された後にスレッドを作成しないのですか? –
もし私がコメントすれば "m_bigClassへのアクセスはそうではないので、そこにデータ競争があるかもしれません。"私が理解しているように、それは状況を修正しないでしょうか? –