2017-06-02 200 views
1

我有一個簡單的程序有兩個線程,其中一個將packaged_task推入deque,其他執行它。在任務中有一個this_thread::sleep_for,我期望只有「進程」線程會等待它,但是兩者都在等待,使得執行順序。我錯過了什麼?this_thread :: sleep_for影響其他線程

#include <future> 
#include <iostream> 
#include <deque> 

std::mutex m; 
std::condition_variable cv; 
std::deque<std::packaged_task<void(int)>> deque; 

void post() { 
    int id = 0; 
    auto lambda = [](int id) { 
     std::this_thread::sleep_for(std::chrono::seconds(std::rand() % 10 + 1)); 
     std::cout << id << std::endl; 
    }; 
    while (true) { 
     std::this_thread::sleep_for(std::chrono::seconds(1)); 

     std::packaged_task<void(int)> task(lambda); 
     task(id++); 

     std::lock_guard<std::mutex> lg(m); 
     deque.emplace_back(std::move(task)); 

     cv.notify_one(); 
    } 
} 

void process() { 
    std::deque<std::packaged_task<void(int)>> to_exec; 
    while (true) { 

     while (!to_exec.empty()){ 
      std::future<void> fut = to_exec.front().get_future(); 
      fut.get(); 

      to_exec.pop_front(); 
     } 

     std::unique_lock<std::mutex> lk(m); 
     cv.wait(lk, []() {return !deque.empty(); }); 

     while (!deque.empty()) { 
      to_exec.push_back(std::move(deque.front())); 
      deque.pop_front(); 
     } 
    } 
} 

int main() { 

    std::thread tpost(post); 
    std::thread tprocess(process); 

    tpost.join(); 
    tprocess.join(); 
} 
+3

一個'packaged_task'本身並不是異步的。它可以傳遞給線程構造函數,因爲它可以被調用,但是沒有後臺線程會自動爲你創建。也許你想用[std :: launch :: async' [啓動策略] [http://

+0

爲什麼在創建'task'後立即調用'task(id ++);'在'post'中?是不是打算綁定'id'的值,以便在最終調用lambda時將它作爲參數傳遞? –

+0

@Someprogrammerdude好點。我會嘗試的。 – mathiasfk

回答