linux使用信号进行线程同步的实例
时间: 2023-12-20 17:03:43 浏览: 80
以下是一个使用信号进行线程同步的实例,其中主线程会等待子线程完成某个任务后才能继续执行:
```c
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mutex; // 定义互斥锁
pthread_cond_t cond; // 定义信号量
int done = 0; // 标记任务是否完成
void *worker(void *arg) {
// 子线程完成任务
printf("Worker: start working...\n");
sleep(3);
pthread_mutex_lock(&mutex); // 加锁
done = 1; // 标记任务完成
pthread_cond_signal(&cond); // 发送信号
pthread_mutex_unlock(&mutex); // 解锁
printf("Worker: task done.\n");
return NULL;
}
int main() {
pthread_t tid; // 子线程 ID
pthread_mutex_init(&mutex, NULL); // 初始化互斥锁
pthread_cond_init(&cond, NULL); // 初始化信号量
pthread_create(&tid, NULL, worker, NULL); // 创建子线程
printf("Main: waiting for task to complete...\n");
pthread_mutex_lock(&mutex); // 加锁
while (done == 0) {
pthread_cond_wait(&cond, &mutex); // 等待信号
}
pthread_mutex_unlock(&mutex); // 解锁
printf("Main: task completed.\n");
pthread_join(tid, NULL); // 等待子线程结束
pthread_mutex_destroy(&mutex); // 销毁互斥锁
pthread_cond_destroy(&cond); // 销毁信号量
return 0;
}
```
在上面的例子中,子线程完成任务后会发送一个信号,主线程会等待信号的到来,如果收到信号则表示任务已经完成,主线程就可以继续执行。需要注意的是,在等待信号时需要先加锁,等待信号到来后再解锁,以避免多个线程同时访问共享变量导致的竞态条件。
阅读全文