考虑下面的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/

10-11 19:44