boost::thread之while(true)型线程终结方法

我们的程序中经常会用到线程来执行某些异步操作,而有些时候我们的线程执行的函数是这个样子的:

  1. void ThreadBody()  
  2. {  
  3.     whiletrue )  
  4.     {  
  5.         std::cout << "Processing..." << std::endl;  
  6.         Sleep(1000);  
  7.     }  
  8. }  

      那么,从理论上讲,这个线程将永远的执行下去,直到这个线程所属的进程运行完毕为止。注意,即使这个线程函数是某个类的成员函数,即使我们创建的,与该线程绑定的boost::thread对象是这个类的成员变量,当这个类被析构的时候,这个线程是仍然在运行的。而当该线程继续访问该类的成员变量或函数的时候,操作系统将抛出异常。这是因为该类(包括其成员变量、函数代码段)所分配的存储空间已经被释放掉了,该线程没有权限再访问这些地址空间。

      所以,我们需要一种方法来终结这样子的线程。下面介绍boost::thread的一种终结这种线程的方法,当然该方法不唯一:

  1. #include <iostream>   
  2. #include <boost/thread.hpp>  
  3.   
  4. /** 注意,windows操作系统下若要编译此程序需要建立的是WIN32控制台属性的工程 */  
  5.   
  6. boost::thread AThread;  
  7.   
  8. void ThreadBody()  
  9. {  
  10.     std::cout << "Thread started." << std::endl;   
  11.       
  12.     try  
  13.     {  
  14.         whiletrue )  
  15.         {  
  16.             /** 手动在线程中加入中断点,中断点不影响其他语句执行 */  
  17.             boost::this_thread::interruption_point();  
  18.             std::cout << "Processing..." << std::endl;  
  19.             Sleep(100);  
  20.         }   
  21.     }  
  22.     catch(...)  
  23.     {   
  24.         std::cout << "Interrupt exception was thrown." << std::endl;   
  25.     }   
  26.      
  27.     /** 通过该语句可以判断线程先退出还是Destroy函数先退出 */  
  28.     std::cout << "Leave Thread." << std::endl;  
  29. }  
  30.   
  31. void Create()  
  32. {  
  33.     AThread = boost::thread( boost::bind( &ThreadBody ) );  
  34.     std::cout << "Thread created with ID: " << AThread.get_id() << std::endl;  
  35. }  
  36.   
  37. void Destroy()  
  38. {  
  39.     std::cout << "Interrupt thread with ID: " << AThread.get_id() << std::endl;  
  40.       
  41.     /** 向线程发送中断请求 */  
  42.     AThread.interrupt();  
  43.     std::cout << "Joining thread..." << std::endl;      
  44.       
  45.     /** join函数,作用是等待直到线程执行结束;可不加,但不能保证退出Destroy函数前线程被终结 */  
  46.     AThread.join();  
  47.     /** 通过该语句可以判断线程先退出还是Destroy函数先退出 */  
  48.     std::cout << "Leave Destroy Function." << std::endl;  
  49. }  
  50.   
  51. void main()  
  52. {  
  53.     Create();  
  54.     Sleep( 1000 );  
  55.     Destroy();  
  56.   
  57.     int dummy;  
  58.     std::cin >> dummy;  
  59. }  

      那么这样就可以正常的结束这个线程了。当然也可以采用在线程中添加标记变量的方法,比如一个bool型的变量。通过控制这个变量也可以达到线程开关的作用。


From: http://blog.csdn.net/raocong2010/article/details/5351672

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值