C ++需要C链接的回调函数

时间:2011-09-30 06:36:23

标签: c++ c thread-safety singleton pthreads

使用pthread_once来考虑以下C ++单例实现 线程安全初始化:

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_once需要回调函数才能进行C-linkage。 (好吧,它只是一个编译器警告,在环境中我正在测试它 代码工作原因C和C ++函数调用约定是二进制兼容的)

但真正的跨平台解决方案有什么好的模式吗?您可以创建一个C-linkage包装器函数,但它不能成为类的一部分,因此调用私有init函数InitOnce。

任何避免让InitOnce公开的解决方案?

P.S。是的,单身人士很糟糕。让我们不要这样做......

2 个答案:

答案 0 :(得分:4)

改为使InitOnce成为朋友的功能,并将其extern "C"联系起来。

答案 1 :(得分:1)

我不明白为什么这应该是一个问题。对于static成员函数,这只是一个关于名称修改的问题,而不是其他问题。由于您的所有代码都是C ++,因此它始终是一致的。这里唯一合成的东西是在C中,没有参数的函数用(void)参数列表声明。我认为这通常不适用于C ++(因为不必要),但你可以尝试,如果这会使你得到的警告沉默。