3

我确实发现了很多关于单例和线程安全的问题,但没有一个能完全回答我这个问题......但如果它是重复的,我深表歉意。

如果我有一个将由多个线程使用的单例对象,我知道应该仔细考虑对成员变量的任何突变,但是对于方法来说是本地的变量呢?

考虑这个伪代码:

class Singleton  [assume this has all the trappings of a proper singleton]
{
    int doSomething() {
        SomeObject obj;
        obj.doStuff();
        return obj.result();
    }

}

在这种情况下,本地“obj”线程安全吗?即使 Singleton 类只有一个对象,每个线程是否都有自己的副本?

4

2 回答 2

4

是的,obj每个线程都是唯一的。

但是,如果它访问和修改公共数据 - 例如doStuffresult访问某个static成员SomeObject或某个全局数据,则可能存在线程问题。

于 2012-12-03T19:48:35.423 回答
0

正如 Luchian 所说,到目前为止你很好,但是,如果你有一个静态或任何 & 或 * 变量,那么尝试使用互斥锁或自旋锁。互斥锁和自旋锁存在于所有基于 unix 的系统中,我认为您也可以在 Windows 中使用它们,但您首先需要以某种方式添加它们。

这是 pthread 互斥锁的链接:http ://www.thegeekstuff.com/2012/05/c-mutex-examples/

这里还有一个适用于 Windows 的:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms686927 (v=vs.85).aspx

于 2012-12-03T21:55:35.530 回答