静态成员函数和线程安全性

时间:2010-12-22 13:55:30

标签: c++ multithreading static-functions

在C ++中,当你在静态成员函数中有局部变量时,它是否意味着那些局部变量也是隐式静态的,还是它们真的是本地变量?

示例:

static void myClass::somefunc(int someint)
{

int myint = someint;  // is myint really a local variable or does it change due to the static qualifier at function level?


}

此外,运行此函数的线程池中的不同线程是否需要通过锁保护myint?假设传递给它的所有值都不同并且彼此没有关系。

编辑:Thanx的答案。现在如果我传入boost::shared_ptr<T>,知道该对象不会被另一个线程同时使用,该怎么办? (不确定是否可以真正保证,或者你可以吗?)

我猜一个原始的ptr传入,如果它被全部使用,需要一些保护吗?

6 个答案:

答案 0 :(得分:9)

它们是本地的,除非你声明它们static - 每次调用函数都有自己的变量副本,你不需要保护它们。

答案 1 :(得分:1)

myintsomefunc的本地版本,您无需跨线程保护它。

答案 2 :(得分:1)

你的例子中的myint是一个局部变量,每次somefunc被称为myint lives。但不会超过这个。

myint不需要保护,因为它是一个局部变量

答案 3 :(得分:1)

myint将真正成为本地人。您不必担心保护它。对于内存中的每个函数调用,将在堆栈上为myint创建一个单独的空间。

答案 4 :(得分:1)

myint变量将保持本地,不需要保护它们,因为每个线程都不会共享局部变量。

答案 5 :(得分:1)

静态关键字表示该函数不会传递隐藏的“this” 论点。此函数也无法访问类实例数据。 函数的静态限定符对函数的本地数据没有影响。

static RetType SomeClass::SomeMethod(Type arg)与自由函数RetType SomeFunc(Type arg)

具有相同的“类型”

的问候,
马尔钦