boost::thread之while(true)型线程终结方法
2011-10-27 00:43
344 查看
我们的程序中经常会用到线程来执行某些异步操作,而有些时候我们的线程执行的函数是这个样子的:
view
plain
void ThreadBody()
{
while( true )
{
std::cout << "Processing..." << std::endl;
Sleep(1000);
}
}
那么,从理论上讲,这个线程将永远的执行下去,直到这个线程所属的进程运行完毕为止。注意,即使这个线程函数是某个类的成员函数,即使我们创建的,与该线程绑定的boost::thread对象是这个类的成员变量,当这个类被析构的时候,这个线程是仍然在运行的。而当该线程继续访问该类的成员变量或函数的时候,操作系统将抛出异常。这是因为该类(包括其成员变量、函数代码段)所分配的存储空间已经被释放掉了,该线程没有权限再访问这些地址空间。
所以,我们需要一种方法来终结这样子的线程。下面介绍boost::thread的一种终结这种线程的方法,当然该方法不唯一:
view
plain
#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型的变量。通过控制这个变量也可以达到线程开关的作用。
From: http://blog.csdn.net/raocong2010/article/details/5351672
view
plain
void ThreadBody()
{
while( true )
{
std::cout << "Processing..." << std::endl;
Sleep(1000);
}
}
那么,从理论上讲,这个线程将永远的执行下去,直到这个线程所属的进程运行完毕为止。注意,即使这个线程函数是某个类的成员函数,即使我们创建的,与该线程绑定的boost::thread对象是这个类的成员变量,当这个类被析构的时候,这个线程是仍然在运行的。而当该线程继续访问该类的成员变量或函数的时候,操作系统将抛出异常。这是因为该类(包括其成员变量、函数代码段)所分配的存储空间已经被释放掉了,该线程没有权限再访问这些地址空间。
所以,我们需要一种方法来终结这样子的线程。下面介绍boost::thread的一种终结这种线程的方法,当然该方法不唯一:
view
plain
#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型的变量。通过控制这个变量也可以达到线程开关的作用。
From: http://blog.csdn.net/raocong2010/article/details/5351672
相关文章推荐
- boost::thread之while(true)型线程终结方法
- boost::thread之while(true)型线程终结方法
- Boost编程之--慎用线程的this_thread::yield()方法
- 创建线程的方法 Thread Runnable
- 线程Thread-----方法(1)-----继承:
- Thread的setDaemon(true)方法的作用
- 安卓4.0以后主线程访问网络问题(NetworkOnMainThreadException)解决方法及子线程更新ui
- 两种方法判断boost线程是否在运行
- python 8-1 如何使用多线程,Thread创建线程,执行函数赋值给target//类+函数放在run方法中执行
- 【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类
- Java - Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
- java线程之用Thread类创建线程的方法
- java Thread 线程的.Join()方法
- boost::threadpool 调用类成员变量并传入参数 的方法
- Thread线程的停止与Timer定时器的停止方法
- 线程 创建和启动线程的两种方式 实现Runnable接口 继承Thread类 重写唯一方法run()
- 子线程更新UI会发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法
- Java并发学习之线程状态及Thread常用方法详解
- 你还在使用while(true) Thread.sleep吗?
- 线程管理之Thread类相关方法简介