多线程和模板化单例竞争条件

时间:2017-05-04 09:18:13

标签: c++ multithreading singleton pthreads race-condition

我正在尝试创建一个多线程和模板化的单例,作为我的高级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编译。

1 个答案:

答案 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;

是原子的。