スレッド間通信簡(1)


スレッド間では,しばしば通信があり,ここではメッセージによる通信について議論する.
データ種別:objectとbuffer.1つはobjectをbufferにパッケージ化し、転送し、到着したらbufferをパケット解除することです.これは分かりやすく、構造は簡単ですが、複数回のメモリコピーが必要で、お得ではありません.もう1つはobjectのポインタをbufferにパッケージすることです.
もう1つは,メッセージベースクラスを定義し,このベースクラスのポインタで伝送することである.さまざまなタイプのオブジェクトは、サブクラスを継承し、汎用テンプレートを提供し、コード量を減らし、->オペレータ、およびメタ*オペレータを提供します.このオブジェクトをポインタオブジェクトとします.これで、簡単なメッセージボディが完成します.もちろん、ローカルとnewから出てきたオブジェクトを内部交換するためにswapオペレータをもう1つ提供します.割り当てなどの問題を低減し、コピーは許可されません.
スレッドはコマンドモードで、メッセージを受信すると、このメッセージを処理するタスクにコミットされます.
道は遠くて深くて、この課題は、ゆっくりと細かく研究して、それから実践で検証します.
 

  
  
  
  
  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;