首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

互斥量、临界区、信号量、事件标志组和消息邮箱(2)

互斥量、临界区、信号量、事件标志组和消息邮箱(2)

⑵ 事件通知:比如可以在生产者—消费者模式的程序中提供事件通知。在这种程序中,消费者在消费资源(例如队列中的数据)前试图获取信号量,生产者一旦生产了资源就增加信号量的值,也就可以理解为生产者把实例交给了信号量,而消费者把实例从信号量中拿走了。这类信号量通常初值为0,其值直到生产者生产了资源才会增加。
上面这个例子说明了:生产者与消费者通过信号量通信,生产者通过向信号量放入实例产生事件通知(通过信号量的值变化来产生事件通知的作用),而消费者通过申请信号量实例来等待事件通知。
⑶ 线程同步:除了使用临界区与互斥量可以完成线程间的同步外,还可以使用信号量,其信号允许多个线程同时使用共享资源,它指出了同时访问共享资源的线程最大数目。在信号量内部有一个计数器,当有线程访问共享资源时,计数器将自动递减,当它为0时,不再允许其他线程对共享资的访问,直到有一个线程释放共享资源,从而完成对共享资源的保护。
多个线程竞争n个资源(n>0),比如有4个资源,那么就初始化量为4,每当线程各自请求信号量的时候,如果信号量为0,则表示没有可用的资源,请求的线程要等它其他占用者释放信号量,如果信号量大于0,则线程的请求被允许,信号量被递减,然后线程可以按约定访问资源,当线程使用资源完毕,应该释放信号量,以便其他线程需要时使用

3.3 互斥量和信号量的区别
如果互斥对程序很关键,那么就该使用互斥量;如果互斥不是程序中的主要因素,那么就使用信号量,因为它比互斥量稍快,使用系统资源比较少。

3.4 信号量的事件通知和线程同步的区别
信号量的事件通知是用于两个线程之间(比如生产者—消费者问题),而信号量的线程同步时用于多线程之间(比如一个可以多人打电话的电话亭问题)。

4 事件标志组
    4.1 事件标志组的理解
事件标志可以被任何线程置位和复位,也可以被任何程序查看,线程可以因为等待一组事件标志被置位而挂起。每个事件标志由一个位代表,每32个事件标志被安排在一组。
    将事件标志置位或复位是通过把当前事件标志组和新的标志组进行逻辑“与”或“逻辑或”;为了得到事件标志,也要做类似的逻辑操作。一旦事件标志组中有标志被置位,系统就会检查相应组的挂起队列,如果能满足挂起线程,则该线程就被恢复。
    4.2 事件标志组的使用场合
    应为一个事件标志组中包括32个1位的标志,可以有非常多的组合方式,所有它比较适合于同步很多线程的场合。
5 消息队列
    5.1 如何理解消息队列
    首先它是一种队列,所以它是一种数据结构,但它又是“消息队列”
,所以它是一种可以传递多个消息(消息也就是数据,实际上传递得是消息的指针)的数据结构。

    5.2 消息队列的使用
    如果线程与线程之间要传递很多消息(数据),那么为了适应不同数据的需要,最好是在存储器中建立多个数据缓冲区,把要传递的数据放在缓冲区中,其中在消息队列中分别存放消息的缓冲区的地址,这样就可实现线程间的数据通信。适合于线程间传递很多数据的场合

    5.3 消息队列的线程间通信和信号量的线程同步的区别
    消息队列的线程间通信是用于传递数据,而信号量的线程同步侧重的是信号量的指示作用。


互斥量和二进制信号量的一个应用:
一个一次只允许一个用户使用的电话亭,为了防止用户发生冲突,电话亭的门上就应该有这样一个标志,并用它来表示电话亭的被只有情况。例如,用一个可以变换两种颜色的牌子,用红色表示“有人”,用绿色表示“没人”。这样,人们见到牌子上的颜色是绿色时(线程通过查询知道信号量的值为1),就可以进去打电话(表示一个进程可以占用此资源(电话亭));如果是红色,那么就只好等待;如果又陆续来了很多人,那么就排队等待。其中,电话亭上的这个牌子就是信号量或互斥量。

信号量同步线程的一个例子:
一个电话亭可以允许多人(线程)打电话,电话亭门上的计数器在每进入一个人时自动减1,而每出去一个人时会自动加1。计数器上的初值就是电话亭的最多能容纳打电话的人数,那么来人只要见到计数器的值大于0,就可以进去打电话;否则只能等待。其中这个计数器就是用于同步线程的信号量。
继承事业,薪火相传
返回列表