Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28609
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-10 15:39
个人简介

。。

文章分类

全部博文(7)

文章存档

2016年(7)

我的朋友

分类: 嵌入式

2016-06-16 19:49:11

功能:同步---->>相互配合完成一件事

POSIX 线程中同步:使用信号量实现,主要是二值信号量,当然信号量可以实现很多功能,不只是同步。

核心:有序

信号量:用来表示一类资源,它的值表示资源的个数,非负整数,等于0意味没资源可用,理解两个概念:
    对资源访问(1为可访问,0为不能访问):
        p操作(申请资源) [将资源的值 - 1]
            ....(执行代码)
        V操作(释放资源) [将资源的值 + 1]  //释放的是另外一个资源,交替使用,理解有序的概念
        
流程(以二值信号量为例):

1.定义信号量(全局变量或者堆上动态分配的内存)
sem_t     sem;
@sem_t      :是个结构体类型(vi -t 查看)
例:
        sem_t     read_sem;
        sem_t     write_sem;  (全局变量)

2.初始化信号量
int sem_init(sem_t sem,int pshared,int value);
@pshared    :0-->>进程间使用   ; 1-->>线程间使用
返回值:
            成功返回0,失败返回-1;
例:
         sem_init(&read_sem,0,0) ;
         sem_init(&write_sem,0,1) ;
(注意:要判断返回值)

3.P操作、V操作(是结合在一起使用的)
int sem_wait(sem_t *sem);
例:
       线程A的处理函数中: if(sem_wait(&read_sem) < 0) //read_sem初始为0,阻塞等待; 
        (注意:放置的位置,该怎么选择)
        线程B的处理函数中: if(sem_wait(&write_sem) < 0) //write_sem初始为1.先执行
        当线程B中先执行完代码后,read_sem进行V操作,sem_post(&read_sem) < 0),其实就相当于加1, 这样线程A就不阻塞了,可以执行; 



阅读(2092) | 评论(0) | 转发(0) |
0

上一篇:linux之线程互斥锁

下一篇:没有了

给主人留下些什么吧!~~