两个问题 mutex 和 message passing 谢谢xtang等expert了

不好意思,另开一贴写求教这两个问题

1. 关于mutex的问题
我想在一个thread中使用不同的mutex,例如2个,一个用于condition variable的判断,另外一个用于满足上述condvar后程序thread运行中shared memory的acess,所以我觉得要把第二个mutex嵌入第一个中。请问这样做可行吗?因为从来没有看到过这样的例子,如果有,麻烦xtang等专家们推荐一下。
2. 关于message passing的问题
我参考另一高手的编程。他的server和client两个不同的pgm(用的pulse)通讯采用message queue. 我不太明白一般的message passing 和message queue有什么本质的区别。 是不是不同的process 通讯只能用message passing

派生出的一个问题就是: 如果我只用msgsendpulse(在server中),和msgreceive(在client中)而不用msgqueue,哪个程序负责创建 channel呢,(我觉得好像是谁receive谁就创建channel, 是这样吗?) 还有在另外一个不创建channel的程序(如这个问题提到的server中)中可以不声明就直接使用别的pgm(如本问题的client)创建的channel吗?


谢谢xtang先生等专家的指点

  1. 可以用两个mutex,但要十分小心lock/unlock的顺序,一不当心就会造成死锁。

  2. “Message Passing”(消息传递) 是一个QNX的概念。通常情况下,这是一个“同步的,单方向的”消息传递。“Message Queue”(消息队列)是一个POSIX的东西,是一个“非同步双向”的传递。进程间既可以用消息传递,也可以用消息队列来传递数据。哪一个更合适,要看具体情况。在QNX上,消息传递通常要比消息队列节省开销。而且同步的传递,对时序控制比较严格(Client MsgSend()以后,只要server不MsgReply(),Client就不会往下执行)。但在有的时候,非同步的传递更为有效。

  3. 基本上是谁MsgReceive()谁ChannelCreate()。Channel是进程的一部份,一个进程创建的Channel,是不可以由另一个无关进程来MsgReceive的。
    一个进程不能“使用”别的进程的Channel。它只能ConnectAttach()别的进程创建好了的Channel,然后在创建的联接上传递消息。