sem_init函数的代码
时间: 2024-05-04 16:22:31 浏览: 100
下面是一个简单的 sem_init 函数的代码示例:
```
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
```
其中,`sem` 是指向要初始化的信号量的指针,`pshared` 指定信号量的类型(如果为 0,则表示信号量将被线程共享;否则,它将被进程共享),`value` 是信号量的初始值。
例如,以下代码初始化了一个进程共享的信号量,初始值为 1:
```
#include <semaphore.h>
sem_t my_sem;
int main() {
sem_init(&my_sem, 1, 1);
// ...
return 0;
}
```
相关问题
sem_init函数
sem_init函数是一个POSIX线程库函数,用于初始化一个命名或未命名的信号量。它的原型如下:
```c
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
```
其中,sem是指向要初始化的信号量的指针,pshared表示信号量的类型,value是信号量的初始值。
如果pshared的值为0,则信号量是进程内的,只能由同一进程内的线程共享;如果pshared的值不为0,则信号量是进程间的,可以由多个进程共享。value表示信号量的初始值,它必须是一个非负整数。
如果sem_init函数成功,返回值为0;如果出错,返回值为-1,并设置errno来指示错误原因。常见的错误包括:EINVAL(无效的参数)、ENOSPC(系统没有足够的空间来创建信号量)和EEXIST(同名的信号量已存在)等。
在使用完信号量后,必须使用sem_destroy函数来销毁它。
C函数篇(sem_init函数)
函数名称: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,因此只有一个线程可以获取信号量,其他线程必须等待。
阅读全文