<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    boost::thread之while(true)型線程終結方法

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    我們的程序中經常會用到線程來執行某些異步操作,而有些時候我們的線程執行的函數是這個樣子的:

     

    [cpp] view plaincopyprint?  
    1. void ThreadBody()  
    2. {  
    3.     while( true )  
    4.     {  
    5.         std::cout << "Processing..." << std::endl;  
    6.         Sleep(1000);  
    7.     }  
    8. }  

     

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

          所以,我們需要一種方法來終結這樣子的線程。下面介紹boost::thread的一種終結這種線程的方法,當然該方法不唯一:

     

    [cpp] view plaincopyprint?  
    1. #include <iostream>   
    2. #include <boost/thread.hpp>  
    3.   
    4. /** 注意,windows操作系統下若要編譯此程序需要建立的是WIN32控制臺屬性的工程 */  
    5.   
    6. boost::thread AThread;  
    7.   
    8. void ThreadBody()  
    9. {  
    10.     std::cout << "Thread started." << std::endl;   
    11.       
    12.     try  
    13.     {  
    14.         while( true )  
    15.         {  
    16.             /** 手動在線程中加入中斷點,中斷點不影響其他語句執行 */  
    17.             boost::this_thread::interruption_point();  
    18.             std::cout << "Processing..." << std::endl;  
    19.             Sleep(100);  
    20.         }   
    21.     }  
    22.     catch(...)  
    23.     {   
    24.         std::cout << "Interrupt exception was thrown." << std::endl;   
    25.     }   
    26.      
    27.     /** 通過該語句可以判斷線程先退出還是Destroy函數先退出 */  
    28.     std::cout << "Leave Thread." << std::endl;  
    29. }  
    30.   
    31. void Create()  
    32. {  
    33.     AThread = boost::thread( boost::bind( &ThreadBody ) );  
    34.     std::cout << "Thread created with ID: " << AThread.get_id() << std::endl;  
    35. }  
    36.   
    37. void Destroy()  
    38. {  
    39.     std::cout << "Interrupt thread with ID: " << AThread.get_id() << std::endl;  
    40.       
    41.     /** 向線程發送中斷請求 */  
    42.     AThread.interrupt();  
    43.     std::cout << "Joining thread..." << std::endl;      
    44.       
    45.     /** join函數,作用是等待直到線程執行結束;可不加,但不能保證退出Destroy函數前線程被終結 */  
    46.     AThread.join();  
    47.     /** 通過該語句可以判斷線程先退出還是Destroy函數先退出 */  
    48.     std::cout << "Leave Destroy Function." << std::endl;  
    49. }  
    50.   
    51. void main()  
    52. {  
    53.     Create();  
    54.     Sleep( 1000 );  
    55.     Destroy();  
    56.   
    57.     int dummy;  
    58.     std::cin >> dummy;  
    59. }  

     

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

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全