1. 程式人生 > >boost::thread程式設計-執行緒中斷

boost::thread程式設計-執行緒中斷

thread的成員函式interrupt()允許正在執行的執行緒被中斷,被中斷的執行緒會丟擲一個thread_interrupted異常,它是一個空類,不是std::exception或boost::exception的子類。thread_interrupted異常應該線上程執行函式裡捕捉和處理,如果執行緒不處理這個異常,那麼預設會中止執行緒的執行。

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <boost/thread.hpp>
#include <boost/atomic.hpp>

boost::mutex io_mu;//io流操作鎖

void to_interrupt(boost::atomic_int &x,const std::string &str)
{
	try
	{
		for(int i=0;i<5;++i)
		{
			boost::this_thread::sleep(boost::posix_time::seconds(1));//等待1s
			//Sleep(1000);//等待1s
			boost::mutex::scoped_lock lock(io_mu);//鎖定io流操作
			std::cout<<str<<++x<<std::endl;
		}
	}
	catch (boost::thread_interrupted& )//捕獲執行緒中斷異常
	{
		std::cout<<"thread interrupted!"<<std::endl;
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	boost::atomic_int x(0);
	boost::thread t(to_interrupt,ref(x),"hello");
	boost::this_thread::sleep(boost::posix_time::seconds(2));//休眠2s
	t.interrupt();//要求執行緒中斷執行
	t.join();//由於執行緒已經中斷,所以立即返回
	getchar();
	return 0;
}
程式執行結果如下:

hello1
hello2
thread interrupted!

由執行結果可知,執行緒在執行了兩次迴圈之後中斷執行。

上面程式中使用了boost::this_thread::sleep()函式,如果換成windows API函式Sleep(1000),重新執行,則發現執行緒並沒有終止。讀者可自行試驗。

這就說明執行緒並不是在任何時候都可以中斷的。

執行緒中斷點:

執行緒並非在任何時候都可以中斷的,thread庫定義了若干個中斷點,只有當執行緒執行到中斷點的時候才可以被中斷,一個執行緒可以有若干個執行緒中斷點。

thread庫定義了9箇中斷點,它們都是函式,如下:

thread::join();

thread::timed_join();
condition_variable::wait();
condition_variable::timed_wait();
condition_variable_any::wait();
condition_variable_any::timed_wait();
thread::sleep();

this_thread::sleep();

this_thread::interruption_point();

這些中斷點的前8個都是某種形式的等待函式,表明執行緒在阻塞的時候可以被中斷。而最後一個this_thread::interruption_point();則是一個特殊的中斷點函式,它並不等待,只是起到一個標籤的作用,表示執行緒執行到這個地方可以被中斷。

注:在xp環境下使用this_thread::sleep的時候會報錯,

解決方法:在stdafx.h中加#define _WIN32_WINNT 0x0501