在以前的multi-process程序中,process之間通過共享內(nèi)存、操作系統(tǒng)提供的消息對列,命名管道等不同方式進(jìn)行數(shù)據(jù)傳遞。為了減少內(nèi)存,以及進(jìn)程切換時引發(fā)的上下文切換的開銷,現(xiàn)在的系統(tǒng)一般采用multi-thread 工作方式。
各process都有各自獨立的地址空間,并且是專有的,因此一個process不能通過指針訪問另一個process中的地址空間。而屬于同一process的各thread,它們共享同一process的地址空間,因此一個thread可以通過指針訪問另一個thread中的地址。這樣我們可以在應(yīng)用中自己定義消息隊列,并對消息隊列的訪問進(jìn)行管理,簡化程序并提高性能。
在multi-thread應(yīng)用中,我們可以使用消息對列來在不同thread之間進(jìn)行消息傳遞,并降低各thread之間的藕合。
它們之間的關(guān)系如下:
生產(chǎn)者:向消息隊列中放數(shù)據(jù)的線程。
消費者:從消息隊列中取出數(shù)據(jù)的線程。
生產(chǎn)者 ----> 消息隊列 ----->消費者
如果應(yīng)用規(guī)定消息隊列的最大長度。在對隊列進(jìn)行控制時,應(yīng)該當(dāng)消息隊列滿時,可能要讓生產(chǎn)者進(jìn)行等待,直到消息隊列中有新的位置可以放入新的消息。當(dāng)消息隊列為空時,應(yīng)該讓消費者進(jìn)行等待,知道有新的消息被加到消息隊列中。
在該模型中有兩點需要注意:
1.不同生產(chǎn)者,消費者同時并發(fā)操作消息隊列時,對各操作的串行化。這個問題可以通過對隊列的操作進(jìn)行加鎖來實現(xiàn)。它的實現(xiàn)可以參考另一篇隨筆《C++同步鎖管理的一種方法》。
2.在消息隊列為空或滿時,應(yīng)用程序的處理。
這可以在C++中采用Monitor.在Monitor中對某種條件進(jìn)行監(jiān)控。
Monitor 對象可以采取的動作:
(1)、等待操作 wait(long timeout = INFINITE), 缺省情況下無限等待下去。
(2)、發(fā)信號操作 signal(long count = 1), 缺省情況下激活一個正在消息隊列上進(jìn)行等代的線程。
對于Monitor的實現(xiàn),可以很簡單地用下列兩種方式實現(xiàn):
1、采用ACE中的ACE_Event, ACE_Thread_Semphore實現(xiàn)。
2、采用 ICE的Cond實現(xiàn), 在Linux上,Cond實際上是通過pthread_cond_t來實現(xiàn)的。