我正在尝试创建一个多线程和模板化的单例,作为我的高级c ++研究的一部分。我被告知我的代码中存在竞争状态,经过几个小时的尝试弄清楚我无法找到它。
我不会写整个班级(虽然这是一个简单的班级),但我确切地关注的地方是:
template <class T>
void Singleton<T>::onceFunction()
{
static T instanceObject;
Singleton<T>::instance = &instanceObject;
}
template <class T>
T& Singleton<T>::getInstance()
{
while (0 == Singleton::instance)
{
static pthread_once_t once_control = PTHREAD_ONCE_INIT;
pthread_once(&once_control, Singleton<T>::onceFunction);
}
return *Singleton::instance;
}
我正在使用pthread_once()因为我没有用c ++ 11编译。
答案 0 :(得分:1)
您展示的代码旨在保护/序列化
的初始化static T instanceObject;
在Singleton<T>::onceFunction()
中定义。为了实现这一点,您使用pthread_once
。但是,您已在函数/块范围内使用静态存储声明pthread_once_t
标志once_control
...
static pthread_once_t once_control = PTHREAD_ONCE_INIT;
因此,我认为once_control
的初始化会遇到与您的代码旨在解决instanceObject
相同的竞争条件。
让once_control
成为Singleton<T>
的静态成员。
注意:您的代码也承担了分配...
Singleton<T>::instance = &instanceObject;
是原子的。