我已经用 C# 编写了一个 ThreadPool 实现,现在我想将它移植到标准 C++ 中(如果可能,使用 boost)。原来的C#版本可以使用委托(delegate)来调用多参数函数,代码是这样的:
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);
}
这里使用委托(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 的 Material ,并且知道可以在结构中声明这些参数,然后将其转换为 (void *)。但是,由于我的大部分功能都已经实现了,所以使用这种方式会非常不方便。
我的问题是:由于 C++ 不支持委托(delegate),有什么方便快捷的方法来实现支持使用多个参数调用函数的线程池?
最佳答案
你可以使用 boost's bind
生成无效函数。这会有点冗长,但你可以调用 RunOrBlock(bind(f, a1, a2, ...)) 而不是调用
。RunOrBlock(f, a1, a2, ...)
关于c# - 实现一个线程池,它可以在 C++ 中调用具有多个参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8145014/