私は POSIX スレッドについて学んでおり、スレッド固有のデータに関するセクションに来ました。この本は、ファイル記述子を使用した優れた例を示しています。ただし、今回はグローバル変数を使用することを除いて、同じ例を自分で実行したかったのです。しかし、私はこの概念を完全に理解するのに苦労しています。
私がやりたいことは次のとおりです。
- グローバル整数を作成する
- グローバル int のキーを宣言する
主に:
- グローバル整数を値に設定します。10
- クリーンアップせずにキーを作成します
- 4 つのスレッドを作成し、それらを送信して thread_func を実行します
- スレッドはそのコピーのみを参照するため、値がまだ 10 であるかどうかを確認します
thread_func で:
- pthread_setspecific(key,global variable) を使用してローカル インスタンスを作成します - これを正しく解釈しているかどうかわかりません
- 関数を呼び出す - dosomething()
- 出口
do_something で
- ローカル ポインターを作成し、それを pthread_getspecific(key) に割り当てます。これにより、グローバル変数のスレッド固有のバージョンが取得されます。
- ローカル ポインタに格納されている値を 2 に変更します
- 出口
コードは次のとおりです。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUMTHREADS 4
pthread_key_t glob_var_key;
int glob_var;
void do_something()
{
//get thread specific data
int* glob_spec_var = (int*) pthread_getspecific(glob_var_key);
printf("Thread %d glob_spec before mod value is %d\n", (unsigned int) pthread_self(), *glob_spec_var);
*glob_spec_var = 2;
printf("Thread %d glob_spec after mod value is %d\n", (unsigned int) pthread_self(), *glob_spec_var);
}
void* thread_func(void *arg)
{
pthread_setspecific(glob_var_key, &glob_var);
do_something();
pthread_exit(NULL);
}
int main(void)
{
pthread_t threads[NUMTHREADS];
int i;
glob_var = 10;
pthread_key_create(&glob_var_key,NULL);
printf("Main: glob_var is %d\n", glob_var);
for (i=0; i < NUMTHREADS; i++)
{
pthread_create(&threads[i],NULL,thread_func,NULL);
}
for (i=0; i < NUMTHREADS; i++)
{
pthread_join(threads[i], NULL);
}
printf("Main: glob_var is %d\n", glob_var);
return 0;
}
私が理解したことから、pthread_getspecific を呼び出すと、各スレッドはメモリ アドレスに対して独自の一意のメモリ アドレスを持っているはずですが、ここではそうではありませんでした。私はこれを正しく行っていないことを知っています.getspecificを実行するときに各スレッドのメモリアドレスを調べようとすると、同じメモリアドレスが表示されました. おそらく、誰かがグローバル変数 (ファイル記述子ではなく) を使用し、スレッドがそれをローカル変数と見なすスレッド固有の使用法を持っている例を教えてくれるでしょう。