[英]When a process ends, what happens to a thread that is in the middle of Sleep()?
[英]What happens to a thread in a vector when function execution ends?
我想了解更多關於std :: thread的信息,特別是如果我有一個線程向量,並且其中一個線程完成執行會發生什么。
想象這個例子:
創建一個線程向量,它們都執行以下函數:
function_test(char* flag)
{
while(*flag == 1) { // Do Something
}
}
'char * flag'指向一個標志,表示停止執行的功能。
比方說,例如,向量包含10個線程,這些線程都在執行。 然后,對於第3個線程,該標志設置為零。(向量中的第4個線程,因為向量從零開始。)
好的做法是加入線程。
vector_of_threads[3].join();
現在,向量包含多少個std :: threads? 我可以再次使用相同的功能重新啟動完成的線程,甚至是不同的功能嗎?
我的問題的原因是我有一個線程向量,有時它們將被要求停止執行,然后執行“從功能的”結束“。
重啟該線程的一種解決方案(我假設,可能不正確?)是從向量中擦除該元素然后插入一個新線程,然后該線程將開始執行。 這是正確的,因為當一個線程停止時,它仍然在向量內嗎? 我想它會是?
編輯
'function_test'不允許修改任何其他函數標志。 標志由它們自己的函數和調用函數修改。 (出於此目的,imag flag啟用main和線程之間的通信。)
這是解決數據爭用問題,還是仍然存在問題?
這不是你要問的具體內容,但是flag
應該是atomic<char>*
或者你有一個數據競爭 ,即未定義的行為。 此外,如果它只有true或false,我會使用atomic<bool>*
並測試if (*flag)
。
至於你的實際問題:
現在,向量包含多少個std :: threads?
它將包含與之前完全相同的數字,但其中一個不再是“可連接”的,因為它不代表正在運行的線程。 當線程停止運行時,它不會神奇地改變向量以移除元素,它甚至不知道向量存在! 主線程中唯一可見的變化是調用vector_of_threads[3].join()
不會阻塞並立即返回,因為線程已經完成,因此您不必等待加入它。
你可以從向量中刪除連接的std::thread
並插入一個新的,但是另一種方法是為它分配另一個std::thread
,它代表一個新的執行線程:
vector_of_threads[3] = std::thread(f, &flags[3]);
現在, vector_of_threads[3]
代表一個正在運行的線程,並且再次“可連接”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.