sem_init 应用例子
时间: 2023-09-08 16:16:39 浏览: 93
当使用多线程编程时,有时我们需要对共享资源进行并发访问的同步操作。`sem_init` 是一个用于初始化一个信号量的函数,它可以用来实现线程之间的同步。
下面是一个示例,展示了如何使用 `sem_init` 初始化一个信号量并在多个线程中使用它进行同步操作:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define NUM_THREADS 5
// 全局变量
int shared_var = 0;
sem_t semaphore;
// 线程函数
void* thread_function(void* arg) {
int id = *((int*)arg);
printf("Thread %d is waiting to enter the critical section.\n", id);
sem_wait(&semaphore); // 信号量减1
printf("Thread %d has entered the critical section.\n", id);
shared_var++; // 对共享变量进行操作
printf("Shared variable value after thread %d: %d\n", id, shared_var);
printf("Thread %d is leaving the critical section.\n", id);
sem_post(&semaphore); // 信号量加1
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
int thread_ids[NUM_THREADS];
sem_init(&semaphore, 0, 1); // 初始化信号量为1
// 创建线程
for (int i = 0; i < NUM_THREADS; i++) {
thread_ids[i] = i;
pthread_create(&threads[i], NULL, thread_function, &thread_ids[i]);
}
// 等待线程结束
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
sem_destroy(&semaphore); // 销毁信号量
return 0;
}
```
在上面的例子中,我们首先包含了必要的头文件,并定义了全局变量 `shared_var` 和信号量 `semaphore`。然后,在 `main` 函数中,我们调用 `sem_init` 初始化信号量为1,表示只允许一个线程进入临界区。
接着,我们创建了 `NUM_THREADS` 个线程,并将每个线程的 ID 存储在 `thread_ids` 数组中。每个线程都会调用 `thread_function`,在该函数中,线程首先等待信号量变为非零值,然后进入临界区对共享变量进行操作,最后离开临界区并增加信号量的值。
最后,我们在主线程中等待所有线程结束,并调用 `sem_destroy` 销毁信号量。这样,我们就完成了对共享资源的并发访问的同步操作。
请注意,在实际使用中,还需要考虑更复杂的同步问题和线程安全性。此处的示例仅用于展示 `sem_init` 的用法。
阅读全文