C函数篇(sem_init函数)
时间: 2023-12-01 08:03:24 浏览: 104
Linux函数大全_
函数名称:sem_init
头文件:#include <semaphore.h>
函数原型:int sem_init(sem_t *sem, int pshared, unsigned int value);
函数功能:初始化一个命名或未命名的信号量
参数说明:
- sem:指向一个信号量的指针
- pshared:指定信号量的类型,取值为0或非0,非0表示信号量在进程间共享,0表示信号量在线程间共享
- value:指定信号量的初始值
返回值:成功返回0,失败返回-1
示例代码:
```
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX_THREADS 5
// 定义信号量
sem_t sem;
void* thread_func(void* arg)
{
int id = *(int*)arg;
printf("Thread %d waiting for semaphore...\n", id);
// 等待信号量
sem_wait(&sem);
printf("Thread %d got semaphore.\n", id);
printf("Thread %d releasing semaphore.\n", id);
// 释放信号量
sem_post(&sem);
return NULL;
}
int main()
{
int i;
int ids[MAX_THREADS];
pthread_t threads[MAX_THREADS];
// 初始化信号量
sem_init(&sem, 0, 1);
// 创建线程
for (i = 0; i < MAX_THREADS; i++) {
ids[i] = i + 1;
pthread_create(&threads[i], NULL, thread_func, &ids[i]);
}
// 等待线程结束
for (i = 0; i < MAX_THREADS; i++) {
pthread_join(threads[i], NULL);
}
// 销毁信号量
sem_destroy(&sem);
return 0;
}
```
该示例程序创建了5个线程,每个线程等待信号量并获取它,然后释放信号量。由于初始化时信号量的值为1,因此只有一个线程可以获取信号量,其他线程必须等待。
阅读全文