在 C++ 中扩展作业/工作线程多线程系统
Expanding on a Job/Worker multi-threading system in C++
我一直在读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()>
(与lambdas结合使用(已经完成了您要用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); });
不再有丑陋的指向成员的东西...
您可以在此处找到更完整的线程池示例:C++11 中的线程池
相关文章:
- 工作线程在执行太快后永久休眠
- ZeroMQ 在使用 std::thread 创建工作线程时崩溃
- 工作线程一直在等待,condition_variable甚至调用了notify_all
- 使用 std::atomic 标志和 std::condition_variable 在工作线程上等待
- Qt-工作线程崩溃时将cv::Mat转换为QImage
- 无法将接口从主线程封送到工作线程
- 在 C++ 中扩展作业/工作线程多线程系统
- Qt C++ - 如何将数据从工作线程传递到主线程?
- 从线程池工作线程使用 GetQueuedCompletionStatus 的奇怪行为
- QtThread:I/O 队列的工作线程
- 将信号从工作线程类连接到控制器类 - QThreads
- Qt:工作线程和 GUI 事件之间的关系
- 将数据集几乎平均分配给工作线程
- 在为工作线程访问 lambda 中捕获的向量列表中的元素引用时,是否需要互斥锁?
- 如何将C++ dll 在 C# 窗口窗体应用程序下的工作线程中运行
- 在Qt中使用工作线程将数据写入文件的正确方法是什么?
- 在工作线程中使用 QT 主窗口
- C++,pthreads:如何从多个线程停止工作线程
- 同步主线程和工作线程
- 从工作线程更新QtCharts的正确方法