簡體   English   中英

如何停止並繼續pthread?

[英]How to stop and continue a pthread?

我用C編碼(實際上是在OOC中,然后編譯為C)。

如何指示線程在特定檢查點等待,直到某個其他線程告訴它繼續?

我實際上在線程中使用了一個緊密循環並輪詢我正在從主線程中更改的變量,但我認為這不是很好的表現,對吧? 除此之外,當我在一個線程中進行緊密循環時,我是否應該在循環中包含一個睡眠以避免消耗大量的CPU功率而只是循環?

看來你正在尋找pthread_cond_wait及其相關函數。

以下是聯機幫助頁面中的引用,其中包含一個示例:

考慮由互斥量mut保護的兩個共享變量x和y,以及每當x變大於y時要發信號通知的條件變量cond。

  int x,y; pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 

等待直到x大於y的執行如下:

  pthread_mutex_lock(&mut); while (x <= y) { pthread_cond_wait(&cond, &mut); } /* operate on x and y */ pthread_mutex_unlock(&mut); 

對x和y的修改可能導致x變得大於y,如果需要,應該表明條件:

  pthread_mutex_lock(&mut); /* modify x and y */ if (x > y) pthread_cond_broadcast(&cond); pthread_mutex_unlock(&mut); 

最后它會滿足您的要求:調用pthread_cond_wait(&cond)的線程被阻塞,直到另一個線程(例如您的主線程)調用pthread_cond_broadcast(&cond) 在此期間,它處於blocked狀態,不消耗CPU周期。

我認為這是一個很好的候選人。 線程應該等待一個條件,另一個線程應該發出信號,讓這個線程繼續。

你可以查找pthread_cond_init,這應該導致其他功能

您應該查看正確的同步原語,例如互斥鎖,條件變量和信號量。 在這種情況下,它聽起來像條件變量是pthreads庫中最合適的工具。

只是讓你知道發生了什么,“緊密循環”就像你的線程執行的任何其他代碼一樣消耗線程的CPU分配。 唯一的區別是它什么都沒做。 好吧,我想讓核心變得溫暖......除非你關心上下文切換的成本,否則你可能永遠都不想這樣做,而且你肯定知道等待時間比你的線程的時間片要短得多,約1毫秒。 我不知道睡眠是否和yield一樣糟糕(AFAIK yield將你的線程設置為在你的優先級激活的線程列表的后面),但兩者都至少會導致上下文切換的懲罰。 上下文切換需要付出代價。 上下文切換是當線程的時間片結束時發生的事情。 它可以結束,因為你以收益或睡眠結束它,或者如果內核通過預先占用你來結束它。 閱讀有關SMP和自旋鎖的信息,以了解有關上下文切換的更多信息以及緊密循環適用時的情況。

此外,當你睡覺時,你並不知道什么時候你會再次醒來。 所以你可能不想睡覺的一個原因是你需要快速完成任務。 在重新安排之前你可以等幾個小時。

其他人都給了你pthread_cond_wait解決方案,它需要通過互斥鎖進行鎖定,看起來簡單明了。 性能可能足以滿足您的需求,但與使用信號的解決方案( sigwait和pthread_kill )相比相對較慢。 復雜性會偷偷摸摸。

這里沒有討論為什么你在測試之前鎖定一個互斥鎖,如果你需要等待條件。 原因是像這樣的代碼有一個缺陷:

      while (x <= y) {
              pthread_cond_wait(&cond, &mut);
      }

你的線程可以測試(X <= Y),看它必須等待,但是在它自己附加到條件值之前要預先設定。 剛修改x或y的其他一些線程在第一個線程附加到條件之前在該時間片中發出信號。 以這種方式,狀態信號丟失。 所以最終發生的是你修改變量信號的變量,你必須添加鎖。

      pthread_mutex_lock(&mut);
      /* modify x and y */
      if (x > y) pthread_cond_broadcast(&cond);
      pthread_mutex_unlock(&mut);

這可能意味着您在許多不同的地方添加這些互斥鎖,因此您的代碼會變得更復雜和更慢。 掛起線程等待條件的可能性總是存在的。 循環,測試,睡眠解決方案沒有這些問題。 因此,如果已知等待時間很短,則在循環中使用睡眠可能是一個很好的解決方案。 特別是如果你可以在測試之間睡一會兒或更長時間。 如果可以,那么不要打擾互斥和條件。 如果睡眠時間很短,比如1ms而且等待時間很長,比如幾分鍾或幾小時,那么你最終會因為不斷醒來並重新入睡而浪費一些資源。 你必須判斷。

還要注意,有時內核會嘗試立即喚醒服務員線程,有時會出現延遲。 如果線程太快喚醒,它將在互斥鎖被鎖定時喚醒並立即返回睡眠狀態,直到互斥鎖解鎖。 如果這成為一個問題,請以這種方式發出信號:

pthread_mutex_lock(&mut);
/* modify x and y */
if (x > y) {
    pthread_mutex_unlock(&mut);
    pthread_cond_broadcast(&cond);
} else
    pthread_mutex_unlock(&mut);

感謝user576875,我復制的代碼示例。

暫無
暫無

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

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