2010-12-22 44 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:答えのためのThanx。今、boost::shared_ptr<T>を渡したら、このオブジェクトが別のスレッドで同時に使用されないことを知っていますか? (確かにそれが保証できるのかどうかは確かではありません)

生のptrが渡されたと思いますが、何か保護が必要なのでしょうか?

+1

あなたは、静的持つ2つの完全に異なる意味で混乱している無料の機能と同じ「タイプ」があります。あなたは一人ではありません。なぜなら、スタンドアロン関数の静的な機能は現在廃止されているのかもしれません。 – Suma

答えて

8

宣言しない限りローカルになります。static - 関数の呼び出しごとに変数のコピーがあり、それらを保護する必要はありません。

+6

@ T33C:彼はどこで「静的な」ローカルを持っていますか? – sharptooth

+1

「静的関数」と「静的な局所変数」を混同しているように見える人もいれば、実際には関係はありません。 –

+1

@ T33C:あなたは間違っています。変数は明らかに静的ではありません(たとえ関数であっても)。 -1 –

1

myintsomefuncのローカルであり、スレッド間で保護する必要はありません。

1

myintはローカル変数です。somefuncはmyint livesと呼ばれるたびに使用されます。それ以上ではありません。そのローカル変数が

1

myint本当にローカルになりますので、

ミンを保護する必要はありません。あなたはそれを保護することについて心配する必要はありません。メモリ内の単一の関数呼び出しごとに、スタック上に別のスペースが作成されます(myint)。

1

変数はローカルにとどまりますので、各スレッドはローカル変数を共有しないため、変数を保護する必要はありません。

1

staticキーワードは、この関数が隠された "this" 引数を渡されないことを意味します。また、関数はクラスインスタンスデータにアクセスすることもできません。 関数の静的修飾子は、関数のローカルデータに影響を与えません。

static RetType SomeClass::SomeMethod(Type arg)RetType SomeFunc(Type arg)

よろしく、
マルチン

関連する問題