C++; 考虑以下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; }

C++; 考虑以下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; },c++,c,thread-safety,singleton,pthreads,C++,C,Thread Safety,Singleton,Pthreads,问题是pthread_曾经需要回调函数来实现C链接。 (好的,这只是一个编译器警告,在我正在测试的环境中 代码工作导致C和C++函数调用约定是二进制兼容的)< /P> 但真正的跨平台解决方案有什么好模式吗?您可以创建一个C链接包装函数,但它不能是类的一部分,因此不能调用私有init函数InitOnce 有没有避免将InitOnce公开的解决方案 是的,单身是不好的。让我们不要这样做……改为使用InitOnce一个朋友函数,并给它extern“C”链接。改为使用InitOnce一个朋友函数,并给它

问题是pthread_曾经需要回调函数来实现C链接。 (好的,这只是一个编译器警告,在我正在测试的环境中 代码工作导致C和C++函数调用约定是二进制兼容的)< /P> 但真正的跨平台解决方案有什么好模式吗?您可以创建一个C链接包装函数,但它不能是类的一部分,因此不能调用私有init函数InitOnce

有没有避免将InitOnce公开的解决方案


是的,单身是不好的。让我们不要这样做……

改为使用
InitOnce
一个朋友函数,并给它
extern“C”
链接。

改为使用
InitOnce
一个朋友函数,并给它
extern“C”
链接。

我不明白为什么这会是个问题。对于
静态
成员函数,这只是一个关于名称损坏的问题,而不是其他问题。因为所有代码都是C++,所以它总是一致的。这里唯一的一点是,在C中,没有参数的函数是用
(void)
参数列表声明的。我认为这通常是不赞成C++的(因为不必要的),但是如果你沉默了你得到的警告,你可以试试。

< P>我不明白为什么这会是个问题。对于
静态
成员函数,这只是一个关于名称损坏的问题,而不是其他问题。因为所有代码都是C++,所以它总是一致的。这里唯一的一点是,在C中,没有参数的函数是用
(void)
参数列表声明的。我认为这通常是不赞成C++(因为不必要的),但是如果你沉默了你得到的警告,你可以试试。当然,这可以通过添加另一个包装器来解决。extern“C”phtreadOnceCallback(){InitOnce();}@enomem:是这样吗?你能给我指一下标准中关于这一点的章节吗?C++从不让我吃惊。”EnOMM:从我阅读的标准来看,我猜如果你向前声明朋友函数,你可以给它C连接。C链接函数不能成为朋友。当然,这可以通过添加另一个包装器来解决。extern“C”phtreadOnceCallback(){InitOnce();}@enomem:是这样吗?你能给我指一下标准中关于这一点的章节吗?C++从不让我惊讶。”EnOMM:从我阅读的标准来看,我猜如果你向前声明朋友函数,你可以给它C连接。