绑定返回值和可变值模板

bind return value and variadic templates

本文关键字:返回值 绑定      更新时间:2023-10-16

我试图在c++中创建一个线程池。这个概念是main将创建一个新的Task, ThreadPool类将获得Task对象并实现其他工作。这是Task类:

template<typename ... Arguments>
        class Task{
            //
        public:
            Task(std::function<void (Arguments...)> _func, Arguments... _args){
                auto f1 = std::bind(_func, _args...);
                f1();
            };
            void run(){
            };
        };

,我是这样使用它的:

#include <iostream>
#include <algorithm>
#include "Task.hpp"
void prtinhi(int a)
{
    std::cout << a << std::endl;
    return;
}
int main(){
    Task<int> task(prtinhi, 5);
    task.run();
    return 0;
}

显然,Task对象将在ThreadPool中传递,ThreadPool将根据某些逻辑调用run()。此代码运行成功打印5。但是我想要的是从run()函数调用f1()。如果我改变任务类有auto f1定义作为类成员,我得到一个错误:

non-static data member declared ‘auto’

如果我声明它是静态的,就不能给它赋值。怎么解这个呢?有更好的方法吗?

为什么任务需要知道函数的参数?该任务应该是一个void()类型擦除的可调用对象。

using Task = std::function<void()>;
Task task([]{ prtinhi(5); });
ThreadPool pool;
pool.schedule(task);
// ...
// `prtinhi(5)` will be eventually called.

如果您需要获得返回值,则需要std::future

ThreadPool可按以下方式实现:

struct ThreadPool
{
    some_lockfree_queue<Task> _queue;
    std::vector<std::thread> _workers;
    void initialize()
    {
        for(int i = 0; i < num_threads; ++i)
        {
            _workers.emplace_back([this]
            { 
                Task t = _queue.try_dequeue();
                t();
            });
        }
    }
};

std::bind(观看STL的演讲了解更多信息)。您应该使用lambdas来绑定所需的参数并返回一个虚函数。