实现一个ThreadPool,可以在c++中调用带有多个参数的函数

Implement a ThreadPool which can call functions with multiple arguments in C++

本文关键字:调用 参数 函数 c++ 一个 ThreadPool 实现      更新时间:2023-10-16

我已经用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个参数等编写多个版本,或者使用某种不安全或不可移植的黑魔法。