DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

 

  1. void ThreadBody()  
  2. {  
  3.     while( true )  
  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.         while( true )  
  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型的变量。通过控制这个变量也可以达到线程开关的作用。

posted on   DoubleLi  阅读(11509)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2013-06-19 DLL搜索路径和DLL劫持
2013-06-19 项目开发中对使用的第三方库统一进行管理__添加属性表/页
2013-06-19 调用DirectDraw接口和调DirectDraw7接口的不同点对比
点击右上角即可分享
微信分享提示