在以前的multi-process程序中,process之间通过共享内存、操作系统提供的消息对列,命名管道等不同方式进行数据传递。为了减少内存,以及进程切换时引发的上下文切换的开销,现在的系统一般采用multi-thread 工作方式。
各process都有各自独立的地址空间,并且是专有的,因此一个process不能通过指针访问另一个process中的地址空间。而属于同一process的各thread,它们共享同一process的地址空间,因此一个thread可以通过指针访问另一个thread中的地址。这样我们可以在应用中自己定义消息队列,并对消息队列的访问进行管理,简化程序并提高性能。
在multi-thread应用中,我们可以使用消息对列来在不同thread之间进行消息传递,并降低各thread之间的藕合。
它们之间的关系如下:
生产者:向消息队列中放数据的线程。
消费者:从消息队列中取出数据的线程。
生产者 ----> 消息队列 ----->消费者
如果应用规定消息队列的最大长度。在对队列进行控制时,应该当消息队列满时,可能要让生产者进行等待,直到消息队列中有新的位置可以放入新的消息。当消息队列为空时,应该让消费者进行等待,知道有新的消息被加到消息队列中。
在该模型中有两点需要注意:
1.不同生产者,消费者同时并发操作消息队列时,对各操作的串行化。这个问题可以通过对队列的操作进行加锁来实现。它的实现可以参考另一篇随笔《C++同步锁管理的一种方法》。
2.在消息队列为空或满时,应用程序的处理。
这可以在C++中采用Monitor.在Monitor中对某种条件进行监控。
Monitor 对象可以采取的动作:
(1)、等待操作 wait(long timeout = INFINITE), 缺省情况下无限等待下去。
(2)、发信号操作 signal(long count = 1), 缺省情况下激活一个正在消息队列上进行等代的线程。
对于Monitor的实现,可以很简单地用下列两种方式实现:
1、采用ACE中的ACE_Event, ACE_Thread_Semphore实现。
2、采用 ICE的Cond实现, 在Linux上,Cond实际上是通过pthread_cond_t来实现的。