簡體   English   中英

如何銷毀由std :: thread顯式創建的線程?

[英]how to destroy a thread explicitly created by std::thread?

我希望兩個線程最初都以無限循環運行,但是在某個時候之后,我想殺死第一個線程而不等待它完成,而第二個線程應該正常運行。 我該如何實施呢? 當我運行以下代碼時,它會給出調試錯誤!

void f1(int i)
{
    while (1)
     {
             printf("Executng Thread  %d : %d\n", i, j);
            Sleep(10);
    }

}


int main()
{   
    std::thread t1(f1, 1);  
    std::thread t2(f1, 2);

    Sleep(100);
     t1.~thread();  
    while (1)
    {

        Sleep(10);
    }
    return 0;
}

程序按照一組控制流執行確定性的指令集。 您不能任意中斷此控制流,而仍然要對程序行為進行推理。

就像您不能在程序不知道並產生有意義的輸出的情況下說“運行我的程序,但不能超過10秒”一樣,您也不能在線程不知道並產生有意義的程序狀態的情況下殺死線程。 簡而言之,“線程取消需要合作”。

這是使您的線程相互配合的一種簡單方法:使用共享標志。

#include <atomic>
#include <chrono>
#include <thread>

std::atomic<bool> thread_1_must_end(false);

void foo(int thread_id)
{
    while (true)
    {
        if (thread_id == 1 && thread_1_must_end.load()) { break; }
        // do stuff
    }
}

int main()
{
    using std::literals::chrono_literals;

    std::thread t1(foo, 1), t2(foo, 2);
    std::this_thread::sleep_for(500ms);

    thread_1_must_end.store(true);
    t1.join();  // 1

    // ...

}

請注意,此過程仍然是協作的 join()操作(標記為// 1 )將阻塞,直到線程函數循環並檢查該標志為止。 沒有時間保證。 如果線程函數忽略該標志,則無法與其進行通信。 您有責任為所有線程功能提供足夠的設施,以便在需要時學習。

暫無
暫無

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

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