Ice 线程与并发 C++

线程

1.Thread类

    1.1概述

          Ice中的基础线程是由ThreadControl类和Thread类来提供的(在IceUtil/IceUtil.h中定义):

          Thread类是一个抽象基类,拥有一个纯虚方法run。要创建线程,必须特化Thread类,并实现run方法。

      1.2 其成员函数
           1)id:该函数返回每个线程的唯一标识符,类型是ThreadID。在调用start函数之前调用它时,会引发ThreadNotStartedException。

           2)start:这个成员函数启动新创建的线程,会调用run方法。start方法同时负责引用计数的加减。

           3)getThreadControl:这个成员函数返回它所在的线程控制对象。在调用start之前调用它同样会触发异常。

           4)operator== 、operator!=、operator<  这些函数比较两个线程的ID,目的是能降Thread对象用于有序的STL容器。

           5)特别注意:必须在堆上分配Thread对象,才能够释放正确。

2.ThreadControl类

        2.1概述

            start方法返回的是类型为ThreadControl对象,指向发出调用的线程

        2.2其成员函数

            1)ThreadControl:缺省构造器返回一个ThreadControl对象,指向发出调用的线程。

            2)id:该函数返回每个线程的唯一标识符,类型是ThreadID。

            3)join:这个方法挂起发起调用的线程,直到join所针对的线程终止为止。例如:

                   IceUtil::ThreadPtr t = new ReaderThread; // Create a thread
                   IceUtil::ThreadControl tc = t->start(); // Start it
                   tc.join(); // Wait for it

           4)detach

                   这个方法分离一个线程。一旦线程分离,就不能再融合;因此必须保证线程在程序离开main函数之前终止。

           5)isAlive:如果底层的线程还没有退出(run方法还没有完成),该方法就返回真。该方法在实现非阻塞的join时很有用。

           6)sleep:这方法挂起线程,时间长度由Time决定。挂起线程就是让该线程离开CPU,让其他线程占用。

           7)yield:这个方法使得它所针对的线程放弃CPU,让其他线程运行。看了它的代码,发现yield的效果等于Sleep(0)。

           8)operator== 、operator!=、operator<  :和上面thread一样.

2.实现线程

      代码 举例说明实现线程(未经严格验证):

//myQueue.h文件

[cpp] view plain copy print ?
  1. <span style="font-size: 16px;">#ifndef MYQUEUE_H_ 
  2. #define MYQUEUE_H_ 
  3.  
  4. #include<IceUtil/Monitor.h> 
  5. #include<IceUtil/Mutex.h> 
  6. //#include <vector> 
  7. #include <list> 
  8. //#include<iostream> 
  9. using namespace std; 
  10. //using namespace IceUtil; 
  11.  
  12. template <class T> 
  13. class Queue : public IceUtil::Monitor<IceUtil::Mutex> 
  14. public
  15.     Queue() : _waitingReaders(0),_waitingWriters(0){} 
  16.  
  17.     void put(const T& item) 
  18.     { 
  19.         IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this); 
  20.         while(_q.size()>10) 
  21.         { 
  22.             try
  23.                 ++_waitingWriters; 
  24.                 wait(); 
  25.                 --_waitingWriters; 
  26.             }catch(...){ 
  27.                 --_waitingWriters; 
  28.                 throw
  29.             } 
  30.         } 
  31.         _q.push_back(item); 
  32.          
  33.         if(_waitingReaders||_waitingWriters) 
  34.         { 
  35.             notify(); 
  36.         } 
  37.     } 
  38.  
  39.     T get() 
  40.     { 
  41.         IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);        
  42.  
  43.         while(_q.size() == 0) 
  44.         { 
  45.             try
  46.                  
  47.                 ++_waitingReaders; 
  48.                 wait(); 
  49.                 --_waitingReaders; 
  50.             }catch (const IceUtil::Exception &e) 
  51.             { 
  52.                 --_waitingReaders; 
  53.                 throw
  54.             } 
  55.         } 
  56.         T item = _q.front(); 
  57.         _q.pop_front(); 
  58.         return item; 
  59.     } 
  60. private
  61.     list<T> _q; 
  62.     short _waitingReaders; 
  63.     short _waitingWriters; 
  64. }; 
  65.  
  66. #endif</span> 


//myMain.cpp文件

[cpp] view plain copy print ?
  1. <span style="font-size: 16px;">#include <myQueue.h> 
  2. #include<vector> 
  3. #include<IceUtil/Thread.h> 
  4.  
  5. Queue<int> q; 
  6.  
  7. class ReaderThread : public IceUtil::Thread 
  8.     virtual void run() 
  9.     { 
  10.         for(int i=0 ; i<5 ; ++i) 
  11.         { 
  12.             cout << "read_value:" << (int)q.get() << endl; 
  13.         } 
  14.     } 
  15. }; 
  16.  
  17. class WriterThread : public IceUtil::Thread 
  18.     virtual void run() 
  19.     { 
  20.         for(int i=0;i<5;++i) 
  21.         { 
  22.             q.put(i); 
  23.             cout<< "write_value:" << i << endl; 
  24.         } 
  25.     } 
  26. }; 
  27.  
  28. int main() 
  29.     vector<IceUtil::ThreadControl> threads; 
  30.     int i; 
  31.  
  32.     for(i=0;i<5;++i) 
  33.     { 
  34.         IceUtil::ThreadPtr t = new WriterThread; 
  35.         threads.push_back(t->start()); 
  36.     } 
  37.  
  38.     for(i =0;i<5;++i) 
  39.     { 
  40.         IceUtil::ThreadPtr t = new ReaderThread; 
  41.         threads.push_back(t->start()); 
  42.     } 
  43.  
  44.     for(vector<IceUtil::ThreadControl>::iterator i = threads.begin(); 
  45.         i != threads.end(); ++i) 
  46.     { 
  47.         i->join(); 
  48.     }  
  49.     return 0; 
  50. }</span> 

你可能感兴趣的:(Ice 线程与并发 C++)