簡體   English   中英

在線程處於睡眠狀態時需要使用pthread_join,pthread_exit或pthread_cancel並需要正常關閉的方法是什么?

[英]What to use pthread_join,pthread_exit or pthread_cancel while thread in sleep and need to close gracefully?

我有一個線程在有條件的情況下運行,它有2分鍾的睡眠時間。 (即

while (condition) {
      //do something
      sleep(120);
   }

為了優雅地終止線程,我使用了pthread_join()並將while條件設置為false (例如someflag = 0

它的工作是終止線程,但是如果線程正在休眠,則直到線程完成休眠后才終止。

這是我需要避免的問題; 即使線程處於睡眠狀態,我也需要盡早使線程出來。

以上都不是。 而不是while (condition) sleep(120); 您應該使用條件變量:

while (condition) {
    ...
    pthread_cond_timedwait(&condvar, &mutex, &abstime);
    ...
}

我選擇pthread_cond_timedwait假定您實際上需要喚醒並每120秒執行一次操作,即使沒有人向您發出信號,但是如果沒有,您可以使用pthread_cond_wait代替。 更改condition后,信令線程需要調用pthread_cond_signal(&condvar) ,當然,對condition依賴狀態的所有訪問(讀取和寫入)都需要由互斥量mutex保護。 您必須在調用pthread_cond_[timed]wait時按住互斥量。 如果您對如何使用條件變量還有其他疑問,請搜索現有的問題/答案(有很多)或進行跟進。

這可能不是正確的答案,但是我建議您采取一種解決方法,將120秒的sleep()分解為更短的時間(例如2秒),然后將其循環。 每次循環執行時,您可以檢查條件,例如

while (condition)
{
  //do something

  int i = 0;
  while(condition && (60 > i))
  {
    sleep (2);
    i++;
  }
}

我希望有人一定會粘貼更好的答案。

暫無
暫無

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

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