つい集めてしまうものはなんですか?

よろしくお願いします。

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

よろしくお願いします。

A 回答 (3件)

変数aaとbb変数bbの違いは「スコープの範囲」だけです。



aaのスコープは「ソースファイル内」であり、bbのスコープは「func関数内」です。

どちらもstaticなので「静的メモリ」に確保されます。

「静的メモリ」は「固定のアドレス」なので、どのスレッドも「同一の固定アドレスを参照」します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/02/07 09:05

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



ブロック内ならどうか。
    • good
    • 0

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

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報