当前位置: 首页 > news >正文

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;
}

相关文章:

  • 每日小积累day1
  • TDengine tar.gz和docker两种方式安装和卸载
  • 【蓝桥杯速成】| 16.完全背包组合|排序
  • Rollup系列之安装和入门
  • MQTT之重复消息(6、在项目中遇到的问题)
  • Pandas **Series**
  • 传统策略梯度方法的弊端与PPO的改进:稳定性与样本效率的提升
  • 【干货】前端实现文件保存总结
  • rce操作
  • 唤起“堆”的回忆
  • 基于自定义注解+反射+AOP+Redis的通用开关设计:在投行交易与风控系统的落地实践
  • golang 的reflect包的常用方法
  • 低速通信之王:LIN总线工作原理入门
  • 创作领域“<em >彩</em><em>票</em><em>导</em><em>师</em><em>带</em><em>玩</em><em>群
  • SvelteKit 最新中文文档教程(15)—— 链接选项
  • C语言的sprintf函数使用
  • Rust 为什么不适合开发 GUI
  • Java后端开发: 如何安装搭建Java开发环境《安装JDK》和 检测JDK版本
  • 【Tauri2】008——简单说说配置文件
  • QtWebApp使用