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

  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. td

    http://jameswxx.iteye.com/blog/1041173 http://crane-ding.iteye.com/blog/968862 http://www.ibm.com/de ...

  2. php language construct 语言构造器

    isset和empty看起来像是函数,我们也经常把它当作函数一样使用,但是实际上,它们是语言构造器. php中的语言构造器就相当于C中的预定义宏的意思,它属于php语言内部定义的关键词,不可以被修改, ...

  3. kingso_sort - Taocode

    kingso_sort - Taocode 如何编写新sort 由于排序逻辑多种多样,kingso的排序设计成是由一个个排序对象串起的排序链条组成.排序对象之间可以任意组合(只需要改配置文件),就可以 ...

  4. Sql 增加字段(有些只能在ORACLE中运行)

    增加字段 alter table table_name add column_name varchar(200) 删除字段 ALTER TABLE table_NAME DROP COLUMN col ...

  5. MySQL具体解释(5)-----------函数超全总结

    mysql函数大全   对于针对字符串位置的操作.第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值. 假设str是空字符串,返回0.假设str是NULL,返 ...

  6. mailcore -- Mail port

    以163为例的各个MailserverSSL协议port号和非SSL协议port号

  7. C语言,链表反转

    倒序思路:依次把后面的节点移往头部. struct Node{ struct Node* next; int data; }; typedef struct Node NODE; NODE* inve ...

  8. BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )

    这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...

  9. 基于visual Studio2013解决C语言竞赛题之1002字符打印

        题目 解决代码及点评 /************************************************************************/ /* ...

  10. MDCC为移动开发者服务:一看、一聊、一聚

    MDCC为移动开发者服务:一看.一聊.一聚-CSDN.NET     MDCC为移动开发者服务:一看.一聊.一聚    发表于2013-11-05 20:54| 2698次阅读| 来源CSDN| 6 ...