[英]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.