线程之无名信号量的使用

 注意点:在Linux系统中用gcc编译器编译线程函数的时候加上-lpthread (写的多了我就知道为什么了)

             使用-lpthread选项是为了链接pthread库(POSIX线程库)。这是因为在Linux下,POSIX线程的相关函数和数据结构都在libpthread库中

gcc -o my_program my_program.c -lpthread
  • 关键特点:
  1. 无名信号量是在共享内存中的数据结构,主要用于进程内的线程同步。
  2. 在创建无名信号量时,不需要指定一个唯一的标识符。
  3. 无名信号量通常用于同一进程内的线程间同步。
  • 创建方式:
  • //通过调用sem_init函数来初始化无名信号量
    
    #include <semaphore.h>
    
    sem_t my_semaphore;
    sem_init(&my_semaphore, 0, initial_value);
    

 LInux代码演示:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>

sem_t sem;//信号量
int num = 0;

void * task(void *arg){
        //获取信号量,(<=0就是获取不到信号量)如果获取不到就阻塞等待
        sem_wait(&sem);
        printf("这个是创建的第%ld个线程\n",pthread_self());

        sleep(2);
        //释放信号量其他的线程可以获取
        sem_post(&sem);
//      while(1){
//              sleep(1);
//              num++;
//              printf("first pthread num = %d\r\n",num);
//      }

}


int main(void){

        sem_init(&sem,0,0);//初始化信号量

        printf("this is main pthread\n");
        pthread_t tid0,tid1;
        if(pthread_create(&tid0,NULL,task,NULL) != 0){
                printf("tid0 pthread create error!\n");
        }
        if(pthread_create(&tid1,NULL,task,NULL) != 0){
                printf("tid1 pthread create error!\n");
        }
        while(1){
                sleep(1);
                num++;
                printf("main pthread num = %d\r\n",num);
        }

        pthread_join(tid0, NULL);//线程回收资源
        pthread_join(tid1, NULL);
        pthread_exit(NULL);//线程退出


        return 0;

因为在初始化信号量的时候给的值是0,所以不管是哪个线程都会被阻塞执行!

结果: {可以发现线程函数是没有执行的}

那么将初始值设置成大于0的时候!

/*
②初始化信号
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:初始化信号量
参数:
        @sem:结构体指针
        @pshared:
                0:多线程间
                1:进程间
        @value:信号量的值,如果填写为1,能获取到信号量,如果是0获取不到信号量
返回值:成功返回0,失败返回-1置位错误码
*/

sem_init(&sem,0,1);//初始化信号量

结果:{线程函数开始执行}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值