QNX手册学习笔记————IPC(2)

读QNX手册《QNX_Neutrino_RTOS_System_Architecture》的InterProcess Communication(IPC)章的Robust implementations with Send/Receive/Reply节。
通过调用线程或进程的Send/Receive/Reply接口,可以架构实现多线程/进程同步的系统应用程序;
线程或进程间的异步调用容易引发问题。首先,对于线程或进程间异步的系统,很难测试,而且当信号句柄(signal handler)发生时,很难保障系统会同我们设计得一样执行;其次容易引发死锁。在QNX中,遵循以下两种方式可以避免死锁。
避免两个线程互相发送数据;
将多个交互的线程设计为树状,数据的传输的方向为从叶子节点向根节点,如下图所示。
QNX手册学习笔记————IPC(2)_第1张图片
B和C线程仅能为D、E和F的Server;而A可以为下面任意节点的Server,MsgSend仅能从低级别指向高级别。采用此种方式可以实现客户端线程将数据传至数据服务器线程;数据服务器线程再将数据传至文件服务器线程的应用场景。
由于禁止从高级别向低级别发送数据,因此QNX引入了MsgDeliverEvent()内核调用来传送非阻塞(nonblocking)事件。此部分较难理解,Architecture手册介绍也少,因此登录黑莓开发者官网查阅MsgDeliverEvent的用法。虽然MsgDeliverEvent可以传递任何事件,但是通常情况下按下图所示应用:
QNX手册学习笔记————IPC(2)_第2张图片

B(server)从A(client)的异步请求接收sigEvent(含义为当条件满足时,server反馈给client的事件),rcvId(含义为唯一标识发送消息的线程的Id?)和server何时通知的client的条件。server调用MsgReply通知client收到请求。保存SIGEvent,rcvId和通知条件,但对收到的event不做任何处理。当client要求的条件满足时,server通过MsgDeliverEvent(根据architecture手册也可用MsgSendPulse)异步方式通知client进一步操作;client如果发送消息(MsgSend)后,调用SignalWaitInfo(MsgReveivePulse是这一类吗?)进行等待则可以变为同步。client收到通知后,再通过请求MsgSend同步的方式向server索要数据,server通过MsgReply返回数据。

如果上层线程(server)要求下层线程(client)进行操作,同样不能采用发送信息的方式,以避免产生死锁。仅能采用的方式是client向server报告的方式。

(附MsgDeliverEvent的详细说明网址并附带例子:http://developer.blackberry.com/playbook/native/reference/com.qnx.doc.neutrino.lib_ref/topic/m/msg

你可能感兴趣的:(【QNX】)