一、信号量
指的是有一个容器中存放数量一定的卡片,如果容器内有卡片,线程可以获取一张;如果容器内没有卡片,线程只能原地等待容器里出现卡片;
线程获取完卡片,使用完后需要及时归还,防止其他线程没有卡片使用;
通俗解释:就是有一群人一起玩一个手机,每次只能一个人有机会玩手机,其他人只能等待当前玩手机的人主动归还后重新分配手机使用;
实际上容器内可以设置最多有多少卡片可以分配;
二、主要函数接口
(一)信号量主要函数库:
semaphore.h
(二)主要函数接口
// 1、信号量的结构体类型
// sem_t是信号量的类型
// 定义信号量变量案例:
// sem_t sem_01
// 2、初始化变量
int sem_init(sem_t* 信号量地址, int phshared, unsigned int value)
// 3、获取一个凭证
// 阻塞获取:如果获取不到,会阻塞等待
int sem_wait(sem_t* sem)
// 尝试获取:尝试获取一个凭证,如果获取不到,返回失败
int sem_trywait(sem_t* sem)
// 4、归还一个凭证
int sem_post(sem_t* sem)
// 5、获取当前剩余凭证数
int get_value(sem_t* sem, int* value)
三、代码如下
#include<stdio.h>
#include<pthread.h>
// 信号量库
#include<semaphore.h>
// 定义一个信号量变量
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;
}
思路:
1、开启一个线程,阻塞在获取信号量卡片的函数上。
2、主线程阻塞等待用户输入字符后,才有机会给信号量归还一个卡片。
3、信号量有了剩余卡片,阻塞的线程就能唤醒,获取卡片,继续执行。