sem_init 代码示例
时间: 2024-08-18 17:00:24 浏览: 64
`sem_init` 是在 POSIX 标准中定义的一个函数,用于初始化一个未命名的信号量。这个函数通常在多线程编程中使用,以实现线程间同步。下面是一个简单的 `sem_init` 的代码示例:
```c
#include <stdio.h>
#include <semaphore.h>
#include <pthread.h>
sem_t sem;
void* thread_function(void* arg) {
// 在使用信号量之前,需要初始化
sem_init(&sem, 0, 0); // 初始化信号量,参数1为指向信号量的指针,参数2指定在进程内还是跨进程共享,参数3为信号量的初始值
// 信号量等待(P操作)
sem_wait(&sem);
printf("线程进入临界区\n");
// 线程的业务逻辑代码
printf("线程退出临界区\n");
// 信号量释放(V操作)
sem_post(&sem);
return NULL;
}
int main() {
pthread_t thread1, thread2;
// 创建线程
pthread_create(&thread1, NULL, thread_function, NULL);
pthread_create(&thread2, NULL, thread_function, NULL);
// 等待线程结束
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
// 销毁信号量
sem_destroy(&sem);
return 0;
}
```
在这个示例中,我们首先定义了一个 `sem_t` 类型的信号量 `sem`。接着定义了一个线程函数 `thread_function`,在这个函数中,我们调用 `sem_init` 来初始化信号量 `sem`,其中第三个参数 `0` 表示信号量的初始计数为 `0`。之后,线程将执行 `sem_wait` 操作进入等待状态,当计数为 `0` 时,线程将被阻塞。当线程通过某种方式释放了信号量(例如通过 `sem_post`),其他等待的线程将继续执行。
注意:实际使用时,需要确保在 `sem_wait` 之前调用 `sem_init`,并且在所有线程完成使用后,通过 `sem_destroy` 来销毁信号量,避免资源泄露。
阅读全文