0

2 つの .c ファイル (main.c と support.c) があります。Support.c が最初にコンパイルされ、次に main.c がコンパイルされ、support.o とリンクされます。support.c にいくつかの非静的グローバル変数があります。

support.c のグローバル変数はどのように保存されますか? main.c がマルチスレッド化されていて、support.c の関数を呼び出す 2 つのスレッドがある場合、それらはそれらのグローバルを共有していますか、それともそれぞれ独自のコピーを持っていますか?

4

3 に答える 3

5

グローバル変数はグローバル変数であり、プログラムをコンパイルしてリンクする部分の数に関係なく、常に 1 つだけです。複数のスレッドが同時にグローバル データにアクセスする場合は、自分で適切な同期を確保する必要があります。

グローバル変数またはブロック静的変数の別のコピーを取得する唯一の方法は_Thread_local、C11 で導入された宣言することです。スレッド ローカル グローバル変数は、スレッドの開始時に初期化され、スレッドの結合時に解放されます。

于 2012-09-20T21:08:25.063 に答える
1

staticC ソースの最上位 (つまり、関数やメソッドの外部) に存在する変数にキーワードを適用する場合と、関数またはキーワード内の変数に使用する場合のキーワードの使用法を混同している可能性があると思いますstatic

ソース コードで関数の外側でトップレベルで宣言された変数は、として宣言しない限りstaticグローバルになります。の場合、そのファイルに対してのみstaticローカルになります。変数のスコープを制御します。

static関数内で宣言すると、変数の有効期間が制御されます。この場合、変数は関数呼び出しが終了した後もメモリ内に保持されるため、その値は複数の関数呼び出しにわたって保持されます。

グローバル変数を宣言した場合 (つまりstatic、ソース ファイルのトップレベルではなく、グローバル変数である場合)、メモリ内には常にそのインスタンスが 1 つだけ存在します。extern他のソースファイルでは、リンカーが他のファイルのオブジェクトファイルで定義されているメモリ位置を探すことを認識できるように宣言する必要がありますが、メモリ内には 1 つしかありません。

于 2012-09-20T21:14:54.560 に答える
0

グローバルを揮発性として宣言することを忘れないでください。そうしないと、コンパイラは、グローバルが別のスレッドによって変更され、安全でない最適化を行うことができることに気付かない可能性があります。

volatile int g_example;

于 2012-09-20T21:53:02.747 に答える