线程之间,经常有通讯,这里讨论一种用消息进行通讯。

数据种类:object 和 buffer 。一种是将object打包成buffer,然后传输,到达后,再将buffer解包。这种很容易理解,结构简单,但需要进行多次内存拷贝,不实惠。另一种是将object的指针打包成buffer。

还有一种,是定义消息基类,通过这个基类的指针进行传输。各种类型的对象,都继承一个子类,提供一通用模板,减少代码量,提供->操作符,和一元*操作符。将这对象当指针对象。这样,简单的消息体就完成了。当然,再提供一个swap操作符,以便本地和new出来的对象进行内部交换。减少赋值等产生的问题,且不允许拷贝。

线程则是一个命令模式,接收到消息,就提交给处理此消息的任务。

道远且深,这个课题,慢慢细究,然后以实践验证之。

 

  1. class IMsg 

  2. virtual ~IMsg(){} 
  3. }; 
  4. template<typename T>
  5. class TMsg:public IMsg
  6. {
  7. T * p;
  8. TMsg(){p=new T();}
  9. ~TMsg(){delete p;p=NULL;}
  10. };
  1. Send(target,IMsg*); 

 下面给个比较完整的demo:

 

  1. #include <list> 
  2. #include <iostream> 
  3. using namespace std; 
  4. class IMsg 
  5. public
  6.     virtual ~IMsg(){} 
  7. }; 
  8. template<typename T> 
  9. class TMsg:public IMsg 
  10. public
  11.     T * m_point; 
  12.     TMsg(){m_point=new T();} 
  13.     TMsg(T*point){m_point=point;} 
  14.     T* operator->() 
  15.     { 
  16.         return m_point; 
  17.     } 
  18.     ~TMsg(){delete m_point;m_point=NULL;} 
  19. }; 
  20. list<IMsg*> msgList; 
  21. void Send(IMsg *pMsg) 
  22.     cout<<"send base"<<endl; 
  23.     msgList.push_back(pMsg); 
  24. template<typename T> 
  25. void Send(TMsg<T> * p) 
  26.     Send((IMsg*)p); 
  27. template<typename T> 
  28. void Send(T*object) 
  29.     cout<<"send template"<<endl; 
  30.     IMsg *msg=new TMsg<T>(object); 
  31.     Send(msg); 
  32. IMsg*Recv() 
  33.     if(msgList.size()==0) 
  34.         return NULL; 
  35.     IMsg * res=msgList.front(); 
  36.     msgList.pop_front(); 
  37.     return res; 
  38. template<typename T> 
  39. TMsg<T> * Recv() 
  40.     if(msgList.size()==0) 
  41.         return NULL; 
  42.     IMsg * res=msgList.front(); 
  43.     TMsg<T> * tres=dynamic_cast<TMsg<T>*>(res); 
  44.     if(tres!=NULL) 
  45.     { 
  46.         msgList.pop_front(); 
  47.         return tres; 
  48.     } 
  49.     return NULL; 
  50.  
  51. class Output 
  52. public
  53.     void print() 
  54.     { 
  55.         cout<<"hello"<<endl; 
  56.     } 
  57. }; 
  58.  
  59. int main() 
  60.     TMsg<char> *pmsg=new TMsg<char>(new char[255]); 
  61.     sprintf(pmsg->m_point,"hello 2"); 
  62.     Send(new Output()); 
  63.     Send(pmsg); 
  64.  
  65.     TMsg<Output>*p=Recv<Output>(); 
  66.     (*p)->print(); 
  67.  
  68.     p=Recv<Output>(); 
  69.     if(p==NULL) 
  70.         cout<<"Output NULL"<<endl; 
  71.     TMsg<char> *p2=Recv<char>(); 
  72.     cout<<p2->m_point<<endl; 
  73.     return 0;