簡體   English   中英

C ++ pthread - 如何取消線程?

[英]C++ pthread - How to cancel a thread?

我有一個我創建的pthread,現在我希望在特定的時間間隔內線程執行一些代碼。 但是用戶也應該能夠取消該線程。 如何取消線程並確保線程在執行代碼時不被取消?

在Java中,您可以使用它

while(!isInterrupted)

pthreads有沒有類似的解決方案。

在問題的示例代碼中,您正在檢查某個變量。 不是在Java中斷線程的正常模式。

在Java中,您通過調用interrupt()方法來中斷線程。

然后線程檢查它是否在IO和系統調用中被中斷(當發生這種情況時可以拋出InterruptedException ;這意味着正在休眠或等待IO的線程可以在被中斷時喚醒)或者通過對isInterrupted()標志進行采樣(通常使用)在循環中的條件,如問題)。

區別很重要; 檢查你聲明的一些標志變量只能在循環和你自己的代碼中; Java中斷系統適用於所有線程和所有非CPU阻塞代碼,而無需程序員的特別努力。

Pthreads具有pthread_cancel()模式,其作用類似於Java中斷模式。

pthread_cancel可用於發送取消請求:

pthread_setcanceltype(3)確定的線程的取消類型可以是異步的或延遲的(新線程的默認值)。 異步可取消性意味着可以隨時取消線程(通常是立即取消,但系統不保證這一點)。 延遲可取消性意味着取消將被延遲,直到線程下一次調用作為取消點的函數。 pthreads(7)提供了可能是或可能是取消點的函數列表。

pthread_setcancelstate(3)確定的線程的可取消狀態可以啟用(新線程的默認值)或禁用。 如果線程已禁用取消,則取消請求將保持排隊,直到線程啟用取消。 如果線程已啟用取消,則其可取消性類型確定何時取消。

所以有幾種選擇:

1:值檢查(效果很好,但你沒有太多的控制權)。

2:檢查pthread_cancel聯機幫助頁,但它有效,但有嚴格的規則。

3:使用pthread_signal,首先需要阻止,而不是恢復信號。 它與第二個選項具有相同的問題。

  • 使用pthreads cancel和signal只能在必須鎖定的線程內工作。 因此設置變量以啟動信號塊。 解鎖可以由任何其他線程完成。
  • 使用互斥鎖或信號量(pthread_mutex,pthread_semaphore)也可以完成相同的操作。

我推薦的網站: http//www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

取消線程沒有特定的功能 你可以使用pthread_cancel來取消線程,如上所述(但我建議反對它,除非你知道你在做什么),並且你必須設置自己的計時器。 但是while(!isInterrupted)是非常可接受的方式。

它應該基本上是這樣的:

while(!isInterrupted)
{
// whatever you want to do
sleep(howLongYouWantToWait);
}
// clean up and exit the thread function here

並且在主線程中有一個全局(或其他,見下文)

volatile bool isInterrupted = false;

完成pthread_join其設置為true ,如果要等待線程完成,則將其設置為pthread_join

您可以使用類變量或傳遞給線程函數的標志指針,或者任何其他方式,而不是全局,全局是最簡單和最不可取的。

當然,如果你想在它等待時取消線程,而不是在完成整個循環之后取消它,那么你需要處理信號和其他東西,但我認為你不是在尋找它。

暫無
暫無

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

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