sem_init 信号量参考代码
时间: 2024-09-10 10:26:50 浏览: 41
sem_syn.rar_linux syn_信号量_线程 同步
`sem_init` 是 POSIX 标准中定义的一个函数,用于初始化一个未命名的信号量。信号量是一种同步机制,用于控制多个进程或线程对共享资源的访问。初始化信号量时,可以设置一个初始值,该值表示资源的数量或者允许的并发访问数。
下面是一个使用 `sem_init` 初始化信号量的简单示例代码:
```c
#include <stdio.h>
#include <semaphore.h>
#include <pthread.h>
#include <unistd.h>
#define MAX_COUNT 10
sem_t sem; // 未命名信号量
void* thread_function(void* arg) {
int id = *((int*)arg);
while (1) {
sem_wait(&sem); // 等待信号量(获取资源)
printf("线程 %d: 已获取资源,正在工作。\n", id);
sleep(1); // 模拟工作
printf("线程 %d: 完成工作,释放资源。\n", id);
sem_post(&sem); // 释放信号量(释放资源)
sleep(1); // 模拟线程的其他任务
}
return NULL;
}
int main() {
pthread_t threads[MAX_COUNT];
int ids[MAX_COUNT];
// 初始化信号量,初始计数为1
if (sem_init(&sem, 0, 1) != 0) {
perror("sem_init error");
return 1;
}
// 创建线程
for (int i = 0; i < MAX_COUNT; i++) {
ids[i] = i;
if (pthread_create(&threads[i], NULL, thread_function, (void*)&ids[i]) != 0) {
perror("pthread_create error");
return 1;
}
}
// 等待线程结束
for (int i = 0; i < MAX_COUNT; i++) {
pthread_join(threads[i], NULL);
}
// 销毁信号量
sem_destroy(&sem);
return 0;
}
```
这段代码创建了一个包含10个线程的线程池,每个线程都会尝试获取信号量以执行其工作。信号量的初始值设置为1,这意味着一次只有一个线程能够通过 `sem_wait` 获取资源并进行工作。当线程完成工作后,它通过 `sem_post` 释放资源,允许其他线程获取资源。
阅读全文