私はC++でシングルトン(静的バージョン)を実装しています。私はこのパターンと潜在的なスレッド安全性の問題に関するすべての論争を知っていますが、なぜこの正確な実装が止まらないのか不思議です。プログラムは決して終了せず、最後にはデッドロック状態のままです。なぜこのC++スタティックシングルトンは止まらないのですか?
singleton.h:
#pragma once
#include <thread>
#include <atomic>
class Singleton
{
public:
static Singleton& getInstance();
private:
std::thread mThread;
std::atomic_bool mRun;
Singleton();
~Singleton();
void threadFoo();
};
singleton.cpp
#include "singleton.h"
Singleton& Singleton::getInstance()
{
static Singleton instance;
return instance;
}
Singleton::Singleton()
{
mRun.store(true);
mThread = std::thread(&Singleton::threadFoo, this);
}
Singleton::~Singleton()
{
mRun.store(false);
if(mThread.joinable())
mThread.join();
}
void Singleton::threadFoo()
{
while(mRun)
{
}
}
main.cppに、私はすでに知っている何
#include "singleton.h"
int main()
{
Singleton::getInstance();
return 0;
}
:
- スレッドが終了する
- メインスレッドが結合にスタックされている
- これは、コンストラクタをpublicにしてmain()内のSingletonのインスタンスを作成すると、静的と何か関係があります。
Visual Studio 2012を使用してください。
に固定されていません。私は現時点では標準的な参照を見つけることができませんが、私はあなたがしようとしていること(スレッドがメインの終わりを過ぎていること)が実際には未定義の動作であるという疑いがあります。 –
おそらく、静的インスタンスが 'main()'よりも寿命が長いためです。 – juanchopanza
コンストラクタをpublicにしてローカルメインの変数として作成すると、同じ動作をしますか? – kassak