野火RTT第23章邮箱
2018年12月29日
10:47
消息队列、邮箱特性:可以一个或多个线程获取一个或多个消息或邮件。
注意点:
第一,FIFO方式排队。消息队列里面的消息、邮箱里面的邮件是按照FIFO方式排列的。
第二、优先级排队。当有多个线程读取消息或邮件时可以支持按优先级谁高谁先读取的原则或者按照FIFO方式读取的。
邮件的发送分为:阻塞方式发送、非阻塞方式发送。前者只能用于线程间发送,后者可以用于线程间发送,中断向线程发送邮件。
每封邮件都是固定大小:4字节,所以它只能发送4字节的数据或者存放数据的地址。不像消息大小用户可设。
邮件框里存放一份邮件,消息框里存放一个消息。邮件框总数、消息框总数有用户定义。不同的是消息总大小包含了一个消息头,每个消息框里都有一个消息头来指向消息。消息总大小:[消息头+消息大小]x消息框总数。而邮件框总数计算就简单了:邮件大小4个字节x邮件框总数。
阻塞发送函数与非阻塞发送函数的区别:非阻塞函数是调用阻塞函数只是超时等待时间参数值为0。
阻塞发送函数:邮箱满了就阻塞当前发送函数,有空邮件了,就被恢复线程,然后接着发送邮件,发送完就恢复因为读取邮箱而被阻塞的线程。
接受函数:当邮箱为空时,挂起当前线程,直到在发送函数里恢复被阻塞的线程,然后接着去读取,读完就恢复因发送被阻塞的线程。
这些线程阻塞的方式在创建邮箱的时候定义的是FIFO方式还是优先级方式。