C 言語でスレッド間通信を行う方法
C言語では、次のような方法で2つのスレッド間で通信を行うことができます。
- スレッドはグローバル変数を共有でき、その読み書きを通して通信できます。ただし、グローバル変数の読み書きには競合状態を避けるためにロックをかける必要があります。
ネイティブな日本語で言い換えると次のようになります。
#include <stdio.h>
#include <pthread.h>
int shared_variable = 0;
pthread_mutex_t mutex;
void* thread1(void* arg) {
pthread_mutex_lock(&mutex);
shared_variable = 1; // 修改共享变量
pthread_mutex_unlock(&mutex);
return NULL;
}
void* thread2(void* arg) {
pthread_mutex_lock(&mutex);
printf("Shared variable: %d\n", shared_variable); // 读取共享变量
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t t1, t2;
pthread_mutex_init(&mutex, NULL);
pthread_create(&t1, NULL, thread1, NULL);
pthread_create(&t2, NULL, thread2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
- pthread_cond_wait()
- pthread_cond_signal()
- pthread_cond_broadcast()
ネイティブの日本語で言い換えてください。1つだけでかまいません。
#include <stdio.h>
#include <pthread.h>
int shared_variable = 0;
pthread_mutex_t mutex;
pthread_cond_t cond;
void* thread1(void* arg) {
pthread_mutex_lock(&mutex);
shared_variable = 1; // 修改共享变量
pthread_cond_signal(&cond); // 发送信号给等待的线程
pthread_mutex_unlock(&mutex);
return NULL;
}
void* thread2(void* arg) {
pthread_mutex_lock(&mutex);
while (shared_variable == 0) {
pthread_cond_wait(&cond, &mutex); // 等待信号
}
printf("Shared variable: %d\n", shared_variable); // 读取共享变量
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t t1, t2;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
pthread_create(&t1, NULL, thread1, NULL);
pthread_create(&t2, NULL, thread2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
以上2つは、スレッド間通信の一般的な手段であり、どれを使用するかは、それぞれの要件とシナリオによって決まります。