考虑下面的C++单件实现,使用pthRead一次
线程安全初始化:
class MySingleton
{
public:
static MySingleton* Instance();
protected:
MySingleton() {};
static void InitOnce();
private:
static MySingleton* instance;
};
MySingleton* MySingleton::instance = NULL;
pthread_once_t singleton_once_control = PTHREAD_ONCE_INIT;
MySingleton* MySingleton::Instance()
{
pthread_once(&singleton_once_control, &InitOnce);
return instance;
}
void MySingleton::InitOnce()
{
instance = new MySingleton;
}
问题是pthread_曾经需要回调函数具有C-链接。
(好的,这只是一个编译器警告,在我测试的环境中
代码工作导致C和C++函数调用约定是二进制兼容的。
但是,对于真正的跨平台解决方案,有什么好的模式吗?您可以创建一个C链接包装函数,但它不能是类的一部分,因此调用私有init函数InitOnce。
有什么解决方案可以避免将InitOnce公开吗?
是的,单身汉很糟糕。让我们不要把这件事。。。
最佳答案
把InitOnce
变成一个friend函数,并给它extern "C"
链接。
关于c++ - C++要求具有C链接的回调函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7606750/