2010-12-22 5 views
10

В 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? 


} 

Кроме того, различные потоки из пула потоков работает эта функция, делает Минт должны быть защищены замком? предполагая, что все переданные ему значения различны и не имеют никакого отношения друг к другу.

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

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

+1

Вы смущены статическими, имеющими две совершенно разные значения. Вы не одиноки, и, возможно, почему статические функции в автономной функции теперь неактуальны. – Suma

ответ

8

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

+6

@ T33C: Откуда у него «статичный» локальный интерес? – sharptooth

+1

Некоторые люди, похоже, путают «статические функции» с «статическими локальными переменными», в то время как между ними нет никакой связи. –

+1

@ T33C: Вы ошибаетесь. Переменная, очевидно, не является статической (даже если функция есть). Удалите свой -1 –

1

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

1

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

Минт не должны быть защищены, так как его локальная переменная

1

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

1

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

1

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

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

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