实现一个ThreadPool,可以在c++中调用带有多个参数的函数
Implement a ThreadPool which can call functions with multiple arguments in C++
我已经用c#写了一个ThreadPool实现,现在我想把它移植到标准的c++中(如果可能的话,使用boost)。原始的c#版本可以使用委托调用带有多个参数的函数,代码类似于:
public static void RunOrBlock(Function function)
{
WorkItem workItem = new WorkItemNoArguments(function);
RunOrBlock(workItem);
}
public static void RunOrBlock<T1>(Function<T1> function, T1 t1)
{
WorkItem workItem = new WorkItem<T1>(function, t1);
RunOrBlock(workItem);
}
这里的"Function"是用delegate定义的:
public delegate void Function();
public delegate void Function<in T1>(T1 t1);
和WorkItem可以类似地定义:
public abstract class WorkItem
{
protected int threadIndex;
public int ThreadIndex
{
get { return threadIndex; }
set { threadIndex = value; }
}
public abstract void Run();
}
public class WorkItem<T1> : WorkItem
{
private readonly Function<T1> _function;
private readonly T1 _t1;
public WorkItem(Function<T1> function, T1 t1)
{
_function = function;
_t1 = t1;
}
public override void Run()
{
_function(_t1);
}
}
我已经读了一些材料的pThread和已经知道,它是可能的声明这些参数在一个结构体,然后将其转换成(void *)。然而,由于我的大多数函数已经实现了,使用这种方式将是非常不方便的。
我的问题是:因为c++没有委托支持,什么是一个方便和方便的方法来实现一个线程池,支持调用多个参数的函数?
您可以使用boost的bind
来生成虚函数。这可能会有点冗长,但你可以用RunOrBlock(bind(f, a1, a2, ...))
代替RunOrBlock(f, a1, a2, ...)
。
非常确定唯一的"好"方法是使用c++ 11可变模板。例如:
template <typename RetType, typename Function, typename... Args>
RetType CallFunc(Func f, Args... args)
{
return f(args...);
}
否则你将不得不为1个参数,2个参数,3个参数等编写多个版本,或者使用某种不安全或不可移植的黑魔法。
相关文章:
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 什么是仅调用一次并调用参数的控制台应用
- 调用参数排列不变函数 f(i++, i++)
- 调用参数不是原子参数的函数是此代码引发异常的原因吗?
- 如何使可调用参数的签名在C++模板中可见?
- x64 函数调用参数推送/移动顺序 (MSVC)
- 如何调用参数由另一个函数生成的函数?
- 从从可调用参数创建的线程对象参数移动构造 C++11 线程
- 正确调用参数化 std::函数
- 是否允许在调用参数中使用类型名 T
- 我不知道如何调用参数为节点类型的函数
- 函数调用参数列表 (C++) 中的空格
- Valgrind 错误:系统调用参数 epoll_pwait(sigmask) 指向不可寻址的字节
- 这C++代码如何让我调用参数数量错误的函数
- 在计算后,在基类之后调用参数化构造函数
- NPAPI调用参数包装
- 在类组合中调用参数化构造函数
- 为什么在创建类对象数组时不能调用参数化构造函数?
- 如何在 for 循环中调用参数化构造函数
- 如何在PIMPL设计模式中调用参数化构造函数