2016-01-27 33 views
1

我有一個異步執行任務的線程池。但是在繼續之前我需要等待某個任務完成(不允許在當前線程中運行任務,該任務必須由工作線程運行)。C++/boost:如何發出異步任務完成信號?

使用C++ 11或Boost實現這個最簡單的方法是什麼?

pool.enqueue([]() { 
    std::this_thread::sleep_for(2s); // task 1 
    // notify task 1 completion??? 
    std::this_thread::sleep_for(2s); // task 2 
    }); 
    // wait until task 1 is complete??? 

回答

0

要回答我自己的問題。

我最終使用一個未來:

std::packaged_task<int()> task1([]() { 
    std::this_thread::sleep_for(2s); // task 1 
    return 1; 
    }); 
    std::future<int> task1result = task1.get_future(); 
    std::thread thread1([&]() { 
    task1(); 
    std::this_thread::sleep_for(2s); // task 2 
    }); 
    int rc1 = task1result.get(); 
    printf("task1 complete: %d\n", rc1); 
    thread1.join(); 
    printf("thread complete\n"); 

沒有,有一個僵局沒有機會,因爲在線程(等待的線程是不是池的一部分)之間不存在循環依賴。

0

使用std :: condition_variable:

std::mutex m; 
bool task1_done=false; 
std::condition_variable cond_var; 
    pool.enqueue([&cond_var, &task1_done]() { 
    std::this_thread::sleep_for(2s); // task 1 
    // notify task 1 completion 
    task1_done=true; 
    cond_var.notify_one(); 
    std::this_thread::sleep_for(2s); // task 2 
    }); 

    // wait until task 1 is complete 
    std::unique_lock<std::mutex> lock(m); 
    while(!task1_done) { 
    cond_var.wait(lock); 
    } 
+0

但是這樣做與線程池是死鎖的祕訣 – sehe

0

您可以使用互斥和wait_for/wait_until

你可以看看example

+0

但這樣做與線程池是死鎖的祕訣 – sehe

1

如果你有一個線程池,無論是游泳池應該處理依賴關係或者應該直接從第一個任務鏈接繼續任務。

否則,池可能會死鎖。想象一下,例如一個線程池。它會無限期地阻止。許多線程在給定足夠任務相關性的情況下也會發生同樣的情況