C言語で異なるスレッドが同じ変数にアクセスする方法
C言語では、異なるスレッドが共有グローバル変数を利用することで同じ変数にアクセスできる。具体的な方法は以下だ。
- 別のスレッドと共有できるグローバル変数を定義します。 例えば、int型のグローバル変数shared_varを定義します。
- スレッド関数を定義する際、スレッド関数がアクセスする必要がある変数を、パラメータとしてスレッド関数に渡します。たとえば、スレッド関数 thread_func1 と thread_func2 があり、両方が shared_var にアクセスする必要があると想定します。
void *thread_func1(void *arg) {
int *shared_var_ptr = (int *)arg;
// 使用shared_var_ptr访问共享变量shared_var
// ...
}
void *thread_func2(void *arg) {
int *shared_var_ptr = (int *)arg;
// 使用shared_var_ptr访问共享变量shared_var
// ...
}
- スレッドを作成するときに、共有変数のアドレスをスレッド関数に引数として渡す。例:
int main() {
pthread_t thread1, thread2;
int shared_var = 0;
// 创建线程并传递共享变量的地址
pthread_create(&thread1, NULL, thread_func1, (void *)&shared_var);
pthread_create(&thread2, NULL, thread_func2, (void *)&shared_var);
// 等待线程结束
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
return 0;
}
上記のコードでは、pthread_create関数を用いてスレッドを作成し、&shared_varをパラメータとして渡すことで、2つのスレッド間で同じshared_varという変数を共有しています。スレッド関数内では、パラメータをint *型にキャストすることで、ポインタを介してshared_varの値にアクセスできます。
共有変数のアクセスには競合状態が発生する可能性があることに注意してください。データの不整合や衝突を避けるためには、排他制御ロックや信号量などの同期メカニズムを使用して共有変数のアクセスを保護する必要があります。