Skip to content

ThreadPool 实现问题 #34

Description

@YiRanMushroom

任务队列其实可以使用std::queue<std::function<void()>>,参考如下代码:

using Task = std::packaged_task<void()>;
std::queue<Task> tasks_;

while (!stop_) {
    Task task;
    {
        std::unique_lock<std::mutex> lock{ mutex_ };
        cv_.wait(lock, [this] {return stop_ || !tasks_.empty(); });
        if (tasks_.empty()) return;
        task = std::move(tasks_.front());
        tasks_.pop();
    }
    task(); 
    // 1:这里task(std::packaged_task<void()>)被调用。其他地方从来没有获取这个task的future。返回的future是另一个由共享指针创建的,不是这个task的。
}

auto task = std::make_shared<std::packaged_task<RetType()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...));
        
std::future<RetType> ret = task->get_future(); 
// 2:这个task(std::packaged_task<RetType()>)由std::make_shared创建,之后返回这个task的future

{
    std::lock_guard<std::mutex> lc{ mutex_ };
    tasks_.emplace([task] {(*task)(); }); 
    // 2处task被wrap在这个lambda中,此处lambda隐式转换为1处std::packaged_task,1处task只被调用而没有获取到future。
}

直接改写成std::function<void()> tasks_; 应该可以通过编译。
这里存在思维混乱问题,using Task = std::packaged_task<void()>; 其实根本没怎么使用,在创建共享指针时使用的是std::packaged_task<RetType()>, 我认为可能直接改成 using Task = std::function<void()>就对了。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions