Linux系统编程:线程 3:信号量

1.信号量的概念

信号量是线程间有顺序的协调工作,信号量 (个数) 反映的是资源的数量,信号量起到锁的效果;

2.信号量的机制

(1)信号量描述可使用资源的个数;

(2)p操作,表示使用这个资源,资源数量-1;

        p操作逻辑:尝试获取资源,有资源可用,直接使用,资源个数-1,如果没有资源可用,此时等待 

(3)v操作,表示使用这个资源,资源数量+1;

        v操作逻辑:表示产生这个资源,资源个数+ 1

写线程——写资源 buf [1024]
        可以写数据的条件 
        1.开始时 ,buf空的,开始写入
        2.写线程写完了,资源-1

读线程——读资源 
       1.写线程结束,读线程开始

        2.读线程读完了,资源+1;

7e68b10e11f04b988d0ae1c87b16227e.png

3.信号量使用

(1)定义信号量(全局区定义),如:sem_t sem_w   (写入),sem_t sem_r   (读取),头文件:#include <semaphore.h>

(2)初始化信号量(主函数开始处初始化):sem_init (&sem_w, 0, 1),sem_init (&sem_r, 0, 0)

sem_init的第二个参数表示信号量是在线程间使用还是在进程间使用,为0表示在线程间使用,非0表示在进程间使用,第三个参数表示资源,1表示有一个资源可用,0表示没有资源;

(3)信号量使用(线程中使用):sem_wait表示p操作,sem_post表示v操作;

线程1中sem_wait (&sem_w),sem_post (&sem_r),表示先进行p操作,sem_w资源-1,然后进行v操作,sem_r资源+1;

线程2中sem_wait (&sem_r),sem_post (&sem_w),表示先进行p操作,sem_r资源-1,然后进行v操作,sem_w资源+1;

(4)信号量销毁(主函数结束前销毁):sem_destroy(&sem_w), sem_destroy(&sem_r);

定义和使用信号量(全局区和线程内):

c9882c466d71428bbc282c55368daac3.png

初始化和销毁信号量(主函数):

94ef17d95a7d4eda8064c1edc878852c.png

运行结果:

7b2edfa8cd5343ff87e9bc82e7aecfaa.png

 

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值