簡體   English   中英

C++ 結束與主線程分離的線程

[英]C++ Ending detached thread from main thread

我有結束分離線程的問題:

void fun_5(int sock_connect)    
{
    unsigned char buff2[76] = {0x01 ,0x01 ,0x02 ,0x02 ,0x00 ,0x4a ,0x31 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x04 ,0x00 ,0x00 ,0x50 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x50 ,0x4c ,0x4d ,0x4f ,0x4d ,0x49 ,0x46 ,0x41 ,0x58 ,0x20 ,0x20 ,0x4e ,0x52 ,0x20 ,0x41 ,0x00 ,0x34 ,0x41 ,0x50 ,0x3c ,0x32 ,0x31 ,0x3e ,0x35 ,0x46 ,0x2e ,0x52 ,0x32 ,0x31 ,0x30 ,0x2f ,0x31 ,0x35 ,0x2f ,0x31 ,0x32 ,0x31 ,0x35 ,0x3a ,0x31 ,0x31 ,0x3a ,0x30 ,0x36 ,0x00 ,0xff ,0xef};
while(thfive)
    {   
            if((send( sock_connect, buff2, sizeof(buff2), MSG_NOSIGNAL ) ) <= 0 )
            {
                close(sock_connect);
                break;
            }
            sleep(5);
    }

}       

當連接到服務器的客戶端(我的程序)發送指定的字節序列(“開始”)時,該線程每 5 秒發送一次字節,當客戶端發送其他序列(“停止”)時,它應該停止發送。

while(thfive) <<- thfive is true when client sends "start", and its false when client sends "stop"

但是當客戶端在不到 5 秒的時間內在“停止”之后發送“開始”時,線程一直在運行。 因此,這個解決方案並不是最好的。 即使線程休眠,也可以選擇檢查條件嗎? 或者我如何從主線程中殺死這個分離的線程?

它在分離線程中工作,因為同時,程序執行其他功能。 我同時有更多這樣的線程(每 1.5 秒、10 秒等發送一次字節)。 我還是編程新手,第一次使用多任務。

謝謝。

編輯 1:我的操作系統是 Linux。

當你讓線程運行而thfive為真時,你必須小心。 編譯器可能會優化循環,以便它只在循環入口處檢查 thfive。 thfive 在循環內不會改變,因此編譯器可能認為沒有必要在每次循環繼續時檢查 thfive。

從 C++11 開始,您應該使用std::atomic<bool>作為 thfive 的類型,另請參閱此 SO question

您還可以考慮創建一個事件並在工作線程終止時向該事件發出信號。 但是如何做到這一點取決於您使用的平台。 例如,對於 Windows,套接字 API 也可以基於事件使用,因此線程可以使用一個函數調用來並行等待終止事件或套接字事件(無需輪詢)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM