线程间数据传递

在以前的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、采用 ICECond实现, Linux上,Cond实际上是通过pthread_cond_t来实现的。

http://www.cppblog.com/martin/archive/2009/03/11/martin_1.html

你可能感兴趣的:(linux学习)