Ice笔记--C++线程与并发(二)

来源:互联网 发布:vue.js app 编辑:程序博客网 时间:2024/05/17 06:15
分类: 分布式架构Ice C/C++910人阅读 评论(0)收藏举报

线程

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 plaincopyprint?
  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. {  
  15. public:  
  16.     Queue() : _waitingReaders(0),_waitingWriters(0){}  
  17.   
  18.     void put(const T& item)  
  19.     {  
  20.         IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);  
  21.         while(_q.size()>10)  
  22.         {  
  23.             try{  
  24.                 ++_waitingWriters;  
  25.                 wait();  
  26.                 --_waitingWriters;  
  27.             }catch(...){  
  28.                 --_waitingWriters;  
  29.                 throw;  
  30.             }  
  31.         }  
  32.         _q.push_back(item);  
  33.           
  34.         if(_waitingReaders||_waitingWriters)  
  35.         {  
  36.             notify();  
  37.         }  
  38.     }  
  39.   
  40.     T get()  
  41.     {  
  42.         IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);         
  43.   
  44.         while(_q.size() == 0)  
  45.         {  
  46.             try{  
  47.                   
  48.                 ++_waitingReaders;  
  49.                 wait();  
  50.                 --_waitingReaders;  
  51.             }catch (const IceUtil::Exception &e)  
  52.             {  
  53.                 --_waitingReaders;  
  54.                 throw;  
  55.             }  
  56.         }  
  57.         T item = _q.front();  
  58.         _q.pop_front();  
  59.         return item;  
  60.     }  
  61. private:  
  62.     list<T> _q;  
  63.     short _waitingReaders;  
  64.     short _waitingWriters;  
  65. };  
  66.   
  67. #endif</SPAN>  


//myMain.cpp文件

[cpp] view plaincopyprint?
  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. {  
  9.     virtual void run()  
  10.     {  
  11.         for(int i=0 ; i<5 ; ++i)  
  12.         {  
  13.             cout << "read_value:" << (int)q.get() << endl;  
  14.         }  
  15.     }  
  16. };  
  17.   
  18. class WriterThread : public IceUtil::Thread  
  19. {  
  20.     virtual void run()  
  21.     {  
  22.         for(int i=0;i<5;++i)  
  23.         {  
  24.             q.put(i);  
  25.             cout<< "write_value:" << i << endl;  
  26.         }  
  27.     }  
  28. };  
  29.   
  30. int main()  
  31. {  
  32.     vector<IceUtil::ThreadControl> threads;  
  33.     int i;  
  34.   
  35.     for(i=0;i<5;++i)  
  36.     {  
  37.         IceUtil::ThreadPtr t = new WriterThread;  
  38.         threads.push_back(t->start());  
  39.     }  
  40.   
  41.     for(i =0;i<5;++i)  
  42.     {  
  43.         IceUtil::ThreadPtr t = new ReaderThread;  
  44.         threads.push_back(t->start());  
  45.     }  
  46.   
  47.     for(vector<IceUtil::ThreadControl>::iterator i = threads.begin();  
  48.         i != threads.end(); ++i)  
  49.     {  
  50.         i->join();  
  51.     }   
  52.     return 0;  
  53. }</SPAN>  
原创粉丝点击