C语言信号量使用案例
一、信号量
指的是有一个容器中存放数量一定的卡片,如果容器内有卡片,线程可以获取一张;如果容器内没有卡片,线程只能原地等待容器里出现卡片;
线程获取完卡片,使用完后需要及时归还,防止其他线程没有卡片使用;
通俗解释:就是有一群人一起玩一个手机,每次只能一个人有机会玩手机,其他人只能等待当前玩手机的人主动归还后重新分配手机使用;
实际上容器内可以设置最多有多少卡片可以分配;
二、代码如下
#include<stdio.h>#include<pthread.h>
#include<semaphore.h>
// 信号量
// sem_t sem_01 这是定义一个变量
//int sem_init(sem_t* sem, int phshared, unsigned int value)// 获取一个凭证,获取不到,会阻塞等待;
//sem_wait()// sem_trywait(sem_t* sem) 尝试获取一个凭证,如果获取不到,返回失败;
// 归还一个凭证
// sem_post()// 获取剩余凭证数
// int get_value(sem_t* sem, int* value)sem_t source;
void init(){
// 成功返回0,失败返回-1
int code = sem_init(&source, 0, 0);
printf("初始返回值:%d \n", code);
}void* test(void* arg){
printf("阻塞获取凭证\n");
// 阻塞等待获取凭证
int code = sem_wait(&source);
printf("凭证获取结果:%d \n", code);
printf("获取成功。。\n");
}int main(){
// 初始化
init();
int value;
int code = sem_getvalue(&source, &value);
if(code == 0){
printf("信号量当前的值:&d \n", value);
}
pthread_t thread;
int c = pthread_create(&thread, NULL, test, NULL);
printf("线程创建结果(0代表成功):%d \n", c);
printf("请输入一个数来继续:");
getchar();
// 给信号量加入一个值
int post = sem_post(&source);
printf("sem_post的返回值:%d \n", post);
return 0;
}