- ベストアンサー
static変数とマルチスレッド
よろしくお願いします。 マルチスレッドとstatic変数の関係で悩んでいます。 マルチスレッドでグローバルstatic変数は __declspec(thread) static int kensu; ってしないと、マルチスレッド間で同じものになってしまうのはわかっているのですが ファンクション内の場合はどうだったのかわかりません。 ---------------------------- static int aa; multi_th() { func(); } func { static int bb; } ---------------------------- この場合、変数aaはマルチスレッド同士で同じものとなると思うのですが 変数bbはマルチスレッド同士で同じものになってしまうのでしょうか よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
変数aaとbb変数bbの違いは「スコープの範囲」だけです。 aaのスコープは「ソースファイル内」であり、bbのスコープは「func関数内」です。 どちらもstaticなので「静的メモリ」に確保されます。 「静的メモリ」は「固定のアドレス」なので、どのスレッドも「同一の固定アドレスを参照」します。
その他の回答 (2)
- eroermine
- ベストアンサー率18% (83/444)
$cat test.c static int foo; int bar(){ return foo; } $gcc -S test.c gcc は -S でアセンブラ出力 test.s を出します。 $cat test.s .file "test.c" .text .p2align 2,,3 .globl bar .type bar, @function bar: pushl %ebp movl %esp, %ebp movl foo, %eax leave ret .size bar, .-bar .local foo .comm foo,4,4 .ident "GCC: (GNU) 3.4.4 [FreeBSD] 20050518" ブロック外のstatic 変数は固定アドレスとなっているのがわかります。 int bar(){ static int foo = 7; dummyfunc(&foo); return foo; } .file "test2.c" .data .p2align 2 .type foo.0, @object .size foo.0, 4 foo.0: .long 7 .text .p2align 2,,3 .globl bar .type bar, @function bar: pushl %ebp movl %esp, %ebp subl $8, %esp subl $12, %esp pushl $foo.0 call dummyfunc addl $16, %esp movl foo.0, %eax leave ret .size bar, .-bar .ident "GCC: (GNU) 3.4.4 [FreeBSD] 20050518" 関数内static 変数もレジスタの影響を受けない固定領域であることがわかります。 ブロック内ならどうか。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
簡単なテストコード書いて試せばいいんじゃないですか?
お礼
ありがとうございます。 これでうまく対処できそうです。