C语言信号量使用案例

发布于:2025-04-05 ⋅ 阅读:(11) ⋅ 点赞:(0)

一、信号量

       指的是有一个容器中存放数量一定的卡片,如果容器内有卡片,线程可以获取一张;如果容器内没有卡片,线程只能原地等待容器里出现卡片;

       线程获取完卡片,使用完后需要及时归还,防止其他线程没有卡片使用;

 

  通俗解释:就是有一群人一起玩一个手机,每次只能一个人有机会玩手机,其他人只能等待当前玩手机的人主动归还后重新分配手机使用;

      实际上容器内可以设置最多有多少卡片可以分配;

 

二、主要函数接口

  (一)信号量主要函数库:

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、信号量有了剩余卡片,阻塞的线程就能唤醒,获取卡片,继续执行。