您的位置:首页 > 产品设计 > UI/UE

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: