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

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

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

boost::thread之while(true)型线程终结方法的更多相关文章

  1. GCC 高版本7.4 编译链接 boost 报错 boost::thread::XXX’未定义的引用 解决方法

    背景:开发中的项目之前一直用GCC4.8,boost库1.48版本的开发环境.现在因业务需求,需要更换GCC7.4,boost库1.70. 问题:可以正常编译BOOST的链接库文件,但是链接时候报错. ...

  2. boost::thread boost库线程

    一.boost::thread的创建 1.线程创建方法一: boost::shared_ptr<boost::thread> writeThread_; boost::function0& ...

  3. Boost Thread学习笔记四

    barrierbarrier类的接口定义如下:  1 class barrier : private boost::noncopyable   // Exposition only 2 { 3 pub ...

  4. Boost Thread学习笔记三

    下面先对condition_impl进行简要分析.condition_impl在其构造函数中会创建两个Semaphore(信号量):m_gate.m_queue,及一个Mutex(互斥体,跟boost ...

  5. Boost Thread学习笔记二

    除了thread,boost种:boost::mutexboost::try_mutexboost::timed_mutexboost::recursive_mutexboost::recursive ...

  6. boost thread 在非正常退出时 内存泄露问题

    在使用boost的thread库的时候,如果主程序退出,thread创建的线程不做任何处理,则会出现内存泄露. 解决方法: 在主线程退出时,对所有thread使用interrupt()命令,然后主程序 ...

  7. Thread 设置 IsBackground true false 的 运行差别

    1.这是一个 后台线程,IsBackground=true,  主线程完成后,后台子线程也停止了,即使 子线程 还有没运行完,也要停止 class Program { static void Main ...

  8. 【boost】MFC dll中使用boost thread的问题

    项目需要,在MFC dll中使用了boost thread(<boost/thread.hpp>),LoadLibraryEx的时候出现断言错误,去掉thread库引用后断言消失. 百度g ...

  9. #include <boost/thread.hpp>

    在这个库最重要的一个类就是boost::thread,它是在boost/thread.hpp里定义的,用来创建一个新线程.它已经被纳入C++标准库中. 小结:新一代C++标准将线程库引入后,将简化多线 ...

随机推荐

  1. Codeforces 509C Sums of Digits 贪心

    这道题目有人用DFS.有人用DP 我觉得还是最简单的贪心解决也是不错的选择. Ok,不废话了,这道题目的意思就是 原先存在一个严格递增的Arrary_A,然后Array_A[i] 的每位之和为Arra ...

  2. Android 四种启动模式 已看晕

    http://blog.csdn.net/zdw890412/article/details/7386314  //有点乱 http://www.cnblogs.com/fanchangfa/arch ...

  3. Flask web开发 简单介绍

    Flask是一个基于python的轻量级web框架.当安装好后Flask后 (pip install flask),就可以开始使用了. 一.最简单的例子 1.新建目录,作为web应用的目录,如: mk ...

  4. Error creating bean with name 'org.springframework.validation.beanvalidation.LocalValidatorFactory

    Error creating bean with name ‘org.springframework.validation.beanvalidation.LocalValidatorFactoryBe ...

  5. NGUI出现Shader wants normals, but the mesh UIAtlas doesn&#39;t have them

    NGUI出现Shader wants normals, but the mesh UIAtlas doesn't have them,没有网格法线,打开UI Root上 UIPanel组建上的 Nor ...

  6. AsyncTask使用须知

    AsyncTask的实现原理就是封装了的线程池,详细见AsyncTask实现原理. 在1.5中初始引入的时候, AsyncTask 运行( AsyncTask.execute() )起来是顺序的,当同 ...

  7. HDU 3336 Count the string KMP

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3336 如果你是ACMer,那么请点击看下 题意:求每一个的前缀在母串中出现次数的总和. AC代码: # ...

  8. C#动态增加边框

    if (this.Width >= 600) { timer1.Enabled = false; } else { this.Width += 30; }

  9. Gas Station|leetcode 贪心

    贪心:尽量将gas[i]-cost[i]>0的放在前面,gas[i]-cost[i]<0的放在后面.(路程的前面有汽油剩下,耗汽油的放在路程的后面). 能否全程通过的 条件 是:sum(g ...

  10. 第三方系统打开EAFC的实现

    前言:EAFC是我们公司的一个框架,一个项目上,客户的OA系统要调用我们推送过去的代办任务,希望能打开我们的代办处理界面,我们的代办处理界面是winform的.引出给出了以下的一个方案.在此备存. - ...