我已经在 C++ 中实现了一个单例(静态版本)。我知道关于这种模式和潜在线程安全问题的所有争议,但我很好奇为什么这个确切的实现不会停止。程序永远不会退出,最后它仍然处于死锁状态。
单例.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();
};
单例.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)
{
}
}
主文件
#include "singleton.h"
int main()
{
Singleton::getInstance();
return 0;
}
我已经知道的:
- 线程终止
- 主线程卡在join中
- 它与静态有关,如果我将构造函数公开并在 main() 中创建 Singleton 的实例,它将正确终止。
使用 Visual Studio 2012。感谢您的建议。