簡體   English   中英

檢查線程是否已完成向其發送另一個參數

[英]Check if a thread is finished to send another param to it

我想檢查線程作業是否已經完成,可以再次調用它並向其發送另一個參數。 代碼是這樣的:

void SendMassage(double Speed)
{
    Sleep(200);
    cout << "Speed:" << Speed << endl;

}

int main() {

    int Speed_1 = 0;
    thread f(SendMassage, Speed_1);

    for (int i = 0; i < 50; i++)
    {
        Sleep(20);

        if (?)
        {
            another call of thread // If last thread done then call it again, otherwise not.
        }

        Speed_1++;
    }

}

我該怎么辦?

使用例如原子標記來指示線程已完成:

std::atomic<bool> finished_flag{false};

void SendMassage(double Speed) {
   Sleep(200);
   cout << "Speed:" << Speed << endl;
   finished_flag = true;    
}

int main() {    
   int Speed_1 = 0;
   thread f(SendMassage, Speed_1);

   while (Speed_1 < 50) {
      Sleep(20);    
      if (finished_flag) {
         f.join();
         finished_flag = false;             
         f = std::thread(SendMassage, Speed_1);
      }          
      Speed_1++;    
   }
   f.join();
}

工作示例: https : //wandbox.org/permlink/BrEMHFvlInshBy5V


請注意,根據您的代碼,我假設您不想在檢查線程f是否完成時阻塞。 否則,只需調用f.join()

如果要等到一個線程完成它的工作而不使用Sleep,就需要調用它的join方法,就像這樣

thread t(SendMassage, Speed_1);
t.join();
//Code here will start executing after returning from join

您可以在這里閱讀更多有關它的信息http://en.cppreference.com/w/cpp/thread/thread/join

關於發送另一個參數,我認為最好的方法是將其拆分為加入該線程后要調用的另一個函數,如果您需要一些僅在函數內部已知的信息,則可以創建一個類來存儲該信息在其字段中,並在您正在執行線程處理的函數中使用它。

可能最簡單的方法是join線程。 沒什么聰明的,但是...

好的,但是如果您的主線程無論如何都一直處於睡眠狀態,那么為什么還要再有一個線程,為什么您肯定會在尋找更聰明的東西。

我個人喜歡排隊的原則。 您可以使用例如std::deque用於:

生產者線程放置一些值,消費者線程將其刪除。 當然,您需要通過std::mutex (或通過其他適當的方式)保護隊列免受競爭條件的侵害...

使用者將在一個無限循環中運行,如果有條目可用,則處理隊列,如果不是這樣,則將休眠。 看看這個響應如何進行等待...

但是,存在隊列已滿的危險,因此如果發現生產者速度太快,則可以在停止或至少減慢生成新值的時間定義一些閾值。 但是,隊列還有另一個優點:如果生產者速度太快,則您可能有多個消費者,所有消費者都服務於同一隊列(取決於您的需求,將結果匯總在一起可能需要付出額外的努力才能保持正確的順序)。

承認,這是要做的很多工作,可能值得付出努力,可能會過大。 如果更簡單的方法已經滿足您的需求,那么Daniel的答案也很好...

暫無
暫無

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

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