c++ - 用 C++ 扩展 Job/Worker 多线程系统

标签 c++ multithreading templates variadic

我一直在阅读 Ben Hoffman 的教程 ( https://benhoffman.tech/cpp/general/2018/11/13/cpp-job-system.html )

我尝试过对他拥有的 Job/Worker 系统的一个版本进行猛烈攻击,但我没有使用 void* 作为参数,然后转换为已知的结构,而是一直在尝试使用可变参数。这个想法是,一个作业接受一个“父级”来执行一个方法,指向该方法的函数指针,以及一个用于参数的 Args... 。但是,如果我尝试构建,则会出现内部编译器错误。这是工作类别:

template <class T, typename... Args>
struct JobMemberFunc : IJob
{
    JobMemberFunc(T* aParent, void (T::* f)(Args...), Args... Args)
    {
        parentObj = aParent;
        func_ptr = f;
        saved_args = ::std::make_tuple (::std::move(Args)...);
    }

    virtual bool invoke() override
    {
        if (!parentObj) { return false; }

        (parentObj->*func_ptr)(::std::move(saved_args));
        return true;
    }

    /** the object to invoke the function pointer on */
    T* parentObj;

    /** The function pointer to call when we invoke this function */
    void (T::* func_ptr)(Args...);

    ::std::tuple<Args...> saved_args;
};


struct CpuJob
{
    IJob* jobPtr = nullptr;
};

然后是 AddJob 方法,实际上发生了内部编译器错误。

template <typename T, typename... Args>
void AddJob(T* aParent, void(T::* func_ptr)(Args...), Args... args)
{//This curly bracket is where the internal compiler error happens
    CpuJob aJob = {};

    JobMemberFunc<T, Args...>* jobPtr = new JobMemberFunc<T, Args...>(aParent, func_ptr, 
    std::forward<Args>(args)...);

    aJob.jobPtr = jobPtr;

    locklessReadyQueue.enqueue(aJob);
}

非常高兴被告知这是一种糟糕/错误的尝试方式。我曾考虑过废除它并拥有一个标准化的参数列表或做一些多态的事情,但我真的想让这项工作发挥作用,这样我就可以真正要求工作系统做任何我喜欢的事情。

谢谢!

最佳答案

std::function<void()> (与 lambda 结合)已经完成了您想要使用 JobMemberFunc 做的事情.

void AddJob(std::function<void()>&& job)
{
    locklessReadyQueue.enqueue(std::move(job));
}

有了这个,您可以将任何函数调用作为作业提交。

例如,调用 some_obj.some_method(some_arg)变成:

  AddJob([&] { some_obj.some_method(some_arg); });

不再有丑陋的指向成员的指针...

您可以在这里找到更完整的线程池示例:Thread pooling in C++11

关于c++ - 用 C++ 扩展 Job/Worker 多线程系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58449989/

相关文章:

c++ - 如何将 vector 返回到 Windows 线程函数?

android - AsncTask 减慢主 (UI) 线程速度

c++ - 多线程程序仅适用于打印语句

jquery - Mustache 和 Jquery 插件问题

c++ - 推导 std::function 结果类型并将其用作参数

html - 如何将HTML图片/文字放在div中的同一行?

c++ - 如何在Xcode项目中使用dlib face_recognition?

c++ - std::regex 是否保证最坏情况下的时间复杂度?

multithreading - 不同线程上的响应回调

c++ - 如何修复此异常?