функция статического члена и безопасность потока - PullRequest
10 голосов
/ 22 декабря 2010

В 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 блокировкой? при условии, что все передаваемые ему значения различны и не имеют никакого отношения друг к другу.

РЕДАКТИРОВАТЬ: Спасибо за ответы. А что если я передам boost::shared_ptr<T>, зная, что этот объект не будет одновременно использоваться другим потоком? (Не уверен, действительно ли это можно гарантировать, или нет?)

Я полагаю, что переданный сырой ptr нуждается в некоторой защите, если бы он использовался повсюду?

Ответы [ 6 ]

9 голосов
/ 22 декабря 2010

Они являются локальными, если вы не объявите их static - каждый вызов функции будет иметь свою собственную копию переменной, и вам не нужно их защищать.

1 голос
/ 22 декабря 2010

Статическое ключевое слово означает, что функции не будет передано скрытое «это» аргумент. Также функция не будет иметь доступа к данным экземпляра класса. Статический классификатор функции не влияет на локальные данные функции.

static RetType SomeClass::SomeMethod(Type arg) имеет тот же "тип", что и свободная функция RetType SomeFunc(Type arg)

С уважением,
Marcin

1 голос
/ 22 декабря 2010

Переменная myint останется локальной, их не нужно защищать, поскольку каждый поток не будет использовать локальные переменные.

1 голос
/ 22 декабря 2010

myint действительно будет локальным. Вам не нужно беспокоиться о его защите. В стеке будет создано отдельное пространство для myint для каждого отдельного вызова функции в памяти.

1 голос
/ 22 декабря 2010

myint в вашем примере - локальная переменная, каждый раз, когда somefunc называется myint life.но не более того.

myint не нуждается в защите, потому что это локальная переменная

1 голос
/ 22 декабря 2010

myint локально для somefunc, и вам не нужно защищать его между потоками.

...