【发布时间】:2012-12-28 05:16:22
【问题描述】:
假设我有一个:
class base
{
base(){f(this);};
static void f(base * b) {(b->d)++;};
int d;
};
现在,如果我在 2 个单独的线程上创建一个 base 类型的对象,方法 f 会被认为是线程安全的吗?
我问这个问题是因为通常据我所知,对于线程安全的方法,它不应该使用静态成员或全局变量。但是从上面的例子可以看出,我决定不将变量d设为静态,而是通过base的运行实例调用它。
另外,我认为我不需要用互斥锁保护这一行:(b->d)++;,因为每个线程都有一个单独的 base 实例和变量 d。
我的分析正确吗?有什么需要注意的吗?
【问题讨论】:
-
你是对的,只要基指针是线程特定的,你就很好。
-
你能编译你的程序吗?它应该抛出一个编译错误
-
@stamhaney,不,我没有,我只是想弄清楚这个理论:) 请指出问题
-
构造函数应该是公共访问权限
-
不必在公共访问权限下(单例通常使用私有/受保护的构造函数),但对于大多数用例来说,这是肯定的。不过,我认为很明显这只是一个示例,大脑的编译器比 CPU 的要轻松得多。
标签: c++ multithreading