簡體   English   中英

當函數執行結束時,向量中的線程會發生什么?

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

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