• ベストアンサー

static変数とマルチスレッド

よろしくお願いします。 マルチスレッドとstatic変数の関係で悩んでいます。 マルチスレッドでグローバルstatic変数は __declspec(thread) static int kensu; ってしないと、マルチスレッド間で同じものになってしまうのはわかっているのですが ファンクション内の場合はどうだったのかわかりません。 ---------------------------- static int aa; multi_th() { func(); } func { static int bb; } ---------------------------- この場合、変数aaはマルチスレッド同士で同じものとなると思うのですが 変数bbはマルチスレッド同士で同じものになってしまうのでしょうか よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

変数aaとbb変数bbの違いは「スコープの範囲」だけです。 aaのスコープは「ソースファイル内」であり、bbのスコープは「func関数内」です。 どちらもstaticなので「静的メモリ」に確保されます。 「静的メモリ」は「固定のアドレス」なので、どのスレッドも「同一の固定アドレスを参照」します。

maki_hiro
質問者

お礼

ありがとうございます。 これでうまく対処できそうです。

その他の回答 (2)

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.2

$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 変数もレジスタの影響を受けない固定領域であることがわかります。 ブロック内ならどうか。

回答No.1

簡単なテストコード書いて試せばいいんじゃないですか?

関連するQ&A