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