boost::thread 終止方式


博客參考: https://www.cnblogs.com/lidabo/p/3796554.html

while(1)情況

void threadFunction()  
{  
    while( true )  
    {  
        std::cout << "todo something..." << std::endl;  
        Sleep(1000);  
    }  
} 

那么,從理論上講,這個線程將永遠的執行下去,直到這個線程所屬的進程運行完畢為止。注意,即使這個線程函數是某個類的成員函數,即使我們創建的,與該線程綁定的boost::thread對象是這個類的成員變量,當這個類被析構的時候,這個線程是仍然在運行的。而當該線程繼續訪問該類的成員變量或函數的時候,操作系統將拋出異常。這是因為該類(包括其成員變量、函數代碼段)所分配的存儲空間已經被釋放掉了,該線程沒有權限再訪問這些地址空間。

 策略1: 線程中設置中斷點  boost::this_thread::interruption_point

#include <iostream>   
#include <Windows.h>
#include <boost/thread.hpp>  
using namespace std;

boost::thread AThread;

void threadFucntion()
{
	std::cout << "Thread started." << std::endl;

	try
	{
		while (true)
		{
			/*
			* 手動在線程中加入中斷點,中斷點不影響其他語句執行 
			*/
			boost::this_thread::interruption_point();
			std::cout << "todo something..." << std::endl;
			Sleep(100);
		}
	}
	catch (...)
	{
		std::cout << "Interrupt exception was thrown." << std::endl;
	}

	/** 通過該語句可以判斷線程先退出還是Destroy函數先退出 */
	std::cout << "Leaving thread" << std::endl;
}

void Create()
{
	AThread = boost::thread(boost::bind(&threadFucntion));
	std::cout << "thread 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;
}

int main()
{
	Create();
	Sleep(1000);
	Destroy();

	getchar();
	return 0;
}

那么這樣就可以正常的結束這個線程了。當然也可以采用在線程中添加標記變量的方法,比如一個bool型的變量。通過控制這個變量也可以達到線程開關的作用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM