c++ - 绑定(bind)返回值和可变参数模板

标签 c++ templates threadpool variadic-templates

我正在尝试用 C++ 创建一个线程池。这个概念是 main 将创建一个新的 Task,ThreadPool 类将获取 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()。如果我将 Task 类更改为将 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 不好 (观看 this talk by STL 了解更多信息)。你应该使用 lambdas绑定(bind)您需要的参数并返回空函数。

关于c++ - 绑定(bind)返回值和可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40550195/

相关文章:

Python SWIG : convert C++ return parameter to return value, 并将原始 C++ 类型转换为 Python 类型

c++ - Visual Studio 2008 中的 cl.exe 包装器

c++ - 我如何指定必须静态链接库 X?

C++函数模板,Int参数问题

c++ - 使用模板进行隐式类型转换

c++ - 在 C++ 中传递多个函数参数的最佳实践

java - 使用 ExecutorService 执行任务 : Can I submit task within another task?

c# - 哪些结构使用 .NET 4 中的 ThreadPool?

java - 为什么在多线程环境中用虚拟记录填充数组列表要花费双倍的时间?

C++流作为重载运算符时的参数<<