我们的程序中经常会用到线程来执行某些异步操作,而有些时候我们的线程执行的函数是这个样子的:
- void ThreadBody()
- {
- while( true )
- {
- std::cout << "Processing..." << std::endl;
- Sleep(1000);
- }
- }
那么,从理论上讲,这个线程将永远的执行下去,直到这个线程所属的进程运行完毕为止。注意,即使这个线程函数是某个类的成员函数,即使我们创建的,与该线程绑定的boost::thread对象是这个类的成员变量,当这个类被析构的时候,这个线程是仍然在运行的。而当该线程继续访问该类的成员变量或函数的时候,操作系统将抛出异常。这是因为该类(包括其成员变量、函数代码段)所分配的存储空间已经被释放掉了,该线程没有权限再访问这些地址空间。
所以,我们需要一种方法来终结这样子的线程。下面介绍boost::thread的一种终结这种线程的方法,当然该方法不唯一:
- #include <iostream>
- #include <boost/thread.hpp>
-
-
- 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;
- }
-
-
- 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;
-
-
- AThread.join();
-
- std::cout << "Leave Destroy Function." << std::endl;
- }
-
- void main()
- {
- Create();
- Sleep( 1000 );
- Destroy();
-
- int dummy;
- std::cin >> dummy;
- }
那么这样就可以正常的结束这个线程了。当然也可以采用在线程中添加标记变量的方法,比如一个bool型的变量。通过控制这个变量也可以达到线程开关的作用。
boost::thread之while(true)型线程终结方法,布布扣,bubuko.com
boost::thread之while(true)型线程终结方法
原文:http://www.cnblogs.com/lidabo/p/3796554.html