我們的程序中經常會用到線程來執行某些異步操作,而有些時候我們的線程執行的函數是這個樣子的:
- void ThreadBody()
- {
- while( true )
- {
- std::cout << "Processing..." << std::endl;
- Sleep(1000);
- }
- }
那么,從理論上講,這個線程將永遠的執行下去,直到這個線程所屬的進程運行完畢為止。注意,即使這個線程函數是某個類的成員函數,即使我們創建的,與該線程綁定的boost::thread對象是這個類的成員變量,當這個類被析構的時候,這個線程是仍然在運行的。而當該線程繼續訪問該類的成員變量或函數的時候,操作系統將拋出異常。這是因為該類(包括其成員變量、函數代碼段)所分配的存儲空間已經被釋放掉了,該線程沒有權限再訪問這些地址空間。
所以,我們需要一種方法來終結這樣子的線程。下面介紹boost::thread的一種終結這種線程的方法,當然該方法不唯一:
- #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型的變量。通過控制這個變量也可以達到線程開關的作用。