boost::thread之while(true)型线程终结方法
我们的程序中经常会用到线程来执行某些异步操作,而有些时候我们的线程执行的函数是这个样子的:
- void ThreadBody()
- {
- while( true )
- {
- std::cout << "Processing..." << std::endl;
- Sleep(1000);
- }
- }
那么,从理论上讲,这个线程将永远的执行下去,直到这个线程所属的进程运行完毕为止。注意,即使这个线程函数是某个类的成员函数,即使我们创建的,与该线程绑定的boost::thread对象是这个类的成员变量,当这个类被析构的时候,这个线程是仍然在运行的。而当该线程继续访问该类的成员变量或函数的时候,操作系统将抛出异常。这是因为该类(包括其成员变量、函数代码段)所分配的存储空间已经被释放掉了,该线程没有权限再访问这些地址空间。
所以,我们需要一种方法来终结这样子的线程。下面介绍boost::thread的一种终结这种线程的方法,当然该方法不唯一:
- #include <iostream>
- #include <boost/thread.hpp>
- /** 注意,windows操作系统下若要编译此程序需要建立的是WIN32控制台属性的工程 */
- boost::thread AThread;
- void ThreadBody()
- {
- std::cout << "Thread started." << std::endl;
- try
- {
- while( true )
- {
- /** 手动在线程中加入中断点,中断点不影响其他语句执行 */
- boost::this_thread::interruption_point();
- std::cout << "Processing..." << std::endl;
- Sleep(100);
- }
- }
- catch(...)
- {
- std::cout << "Interrupt exception was thrown." << std::endl;
- }
- /** 通过该语句可以判断线程先退出还是Destroy函数先退出 */
- std::cout << "Leave Thread." << std::endl;
- }
- void Create()
- {
- AThread = boost::thread( boost::bind( &ThreadBody ) );
- std::cout << "Thread created with ID: " << AThread.get_id() << std::endl;
- }
- void Destroy()
- {
- std::cout << "Interrupt thread with ID: " << AThread.get_id() << std::endl;
- /** 向线程发送中断请求 */
- AThread.interrupt();
- std::cout << "Joining thread..." << std::endl;
- /** join函数,作用是等待直到线程执行结束;可不加,但不能保证退出Destroy函数前线程被终结 */
- AThread.join();
- /** 通过该语句可以判断线程先退出还是Destroy函数先退出 */
- std::cout << "Leave Destroy Function." << std::endl;
- }
- void main()
- {
- Create();
- Sleep( 1000 );
- Destroy();
- int dummy;
- std::cin >> dummy;
- }
那么这样就可以正常的结束这个线程了。当然也可以采用在线程中添加标记变量的方法,比如一个bool型的变量。通过控制这个变量也可以达到线程开关的作用。
boost::thread之while(true)型线程终结方法的更多相关文章
- GCC 高版本7.4 编译链接 boost 报错 boost::thread::XXX’未定义的引用 解决方法
背景:开发中的项目之前一直用GCC4.8,boost库1.48版本的开发环境.现在因业务需求,需要更换GCC7.4,boost库1.70. 问题:可以正常编译BOOST的链接库文件,但是链接时候报错. ...
- boost::thread boost库线程
一.boost::thread的创建 1.线程创建方法一: boost::shared_ptr<boost::thread> writeThread_; boost::function0& ...
- Boost Thread学习笔记四
barrierbarrier类的接口定义如下: 1 class barrier : private boost::noncopyable // Exposition only 2 { 3 pub ...
- Boost Thread学习笔记三
下面先对condition_impl进行简要分析.condition_impl在其构造函数中会创建两个Semaphore(信号量):m_gate.m_queue,及一个Mutex(互斥体,跟boost ...
- Boost Thread学习笔记二
除了thread,boost种:boost::mutexboost::try_mutexboost::timed_mutexboost::recursive_mutexboost::recursive ...
- boost thread 在非正常退出时 内存泄露问题
在使用boost的thread库的时候,如果主程序退出,thread创建的线程不做任何处理,则会出现内存泄露. 解决方法: 在主线程退出时,对所有thread使用interrupt()命令,然后主程序 ...
- Thread 设置 IsBackground true false 的 运行差别
1.这是一个 后台线程,IsBackground=true, 主线程完成后,后台子线程也停止了,即使 子线程 还有没运行完,也要停止 class Program { static void Main ...
- 【boost】MFC dll中使用boost thread的问题
项目需要,在MFC dll中使用了boost thread(<boost/thread.hpp>),LoadLibraryEx的时候出现断言错误,去掉thread库引用后断言消失. 百度g ...
- #include <boost/thread.hpp>
在这个库最重要的一个类就是boost::thread,它是在boost/thread.hpp里定义的,用来创建一个新线程.它已经被纳入C++标准库中. 小结:新一代C++标准将线程库引入后,将简化多线 ...
随机推荐
- Struts2-ActionContext
官方解释: The ActionContext is the context in which an {@link Action} is executed. Each context is basic ...
- 【集训笔记】贪心算法【HDOJ1052 【HDOJ2037
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- Chapter 3.单一职责原则
单一职责原则:就一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,就等于把这些职责耦合在一起, ...
- 生成pdf文件
- B - 队列,推荐
Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Status Desc ...
- 再写KMP算法
#include<iostream> #include<string> using namespace std; void getNext(char const*T,int l ...
- 转:Android -- ActivityLifeCycleCallbacks
http://www.cnblogs.com/yydcdut/p/4945990.html 一个不常见类的使用,名字叫ActivityLifeCycleCallbacks 通常一个项目中有很多个act ...
- GPSR协议移植
修改的文件有packet.h.cmu-trace.cc.priqueue.cc.ns-packet.tcl.Makefile 1.在 $HOME/ns-allinone-2.29/ns-2.29下新建 ...
- 一步一步重写 CodeIgniter 框架 (3) —— 用面向对象重构代码
前面两篇文章为了重点突出 CodeIgniter 框架的原理,程序的结构很乱,有很多全局变量,在这一课中我们采用面向对象的方法对原先代码进行重构. 到目前为止,程序主要完成的就是 URL 分析,并根据 ...
- 怎样在android实现uc和墨迹天气那样的左右拖动效果
import android.app.Activity; import android.os.Bundle; import android.content.Context; import androi ...