c ++中的静态初始化和线程安全性

时间:2012-11-12 05:09:31

标签: c++ multithreading static thread-safety

类实例的静态初始化不是线程安全的。下面的代码是不应该做的事情的一个例子:

extern int computesomething();

class cachedcomputation
{
public:
    cachedcomputation()
    {
        result = computesomething();
    }

    int result;
};

void usecached()
{
    static cachedcomputation c;

    // use of c.result - may break
}

但是,下面的代码是否是线程安全的? (忽略解决方案的丑陋)何时或为何会破坏?

extern int computesomething();

class cachedcomputation
{
public:
    cachedcomputation()
    {
    if(0==InterlockedCompareExchange(&mutex, 1, 0))
    {
        // first thread
            result = computesomething();
        InterlockedExchange(&mutex, 2);
    }
    else
    {
        // other thread - spinlock until mutex==2
        while(2!=InterlockedCompareExchange(&mutex, 2, 2)){}
    }
    }

    int result;

private:
    long mutex;
};

void usecached()
{
    static cachedcomputation c;

    // use of c.result - ???
}

1 个答案:

答案 0 :(得分:3)

你需要:

  • 初始化您的“mutex”
  • 在if块的末尾重置“mutex”:InterlockedExchange(& mutex,0)
  • 可选地将if语句转换为while,因此您的代码将阻塞,直到“mutex”解锁