c# - 实现一个线程池,它可以在 C++ 中调用具有多个参数的函数

标签 c# c++ multithreading delegates

我已经用 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/

相关文章:

c# - 银光 : How to do data entry to a collection?

c# - abstract new/virtual/override/abstract 关键字的一些现实示例是什么?

c# - 懒惰<> Ninject 注入(inject)

c++ - 从 VBA 访问 C++ 中的嵌套结构

c++ - 数组中字符串的迭代器

java - 为什么不鼓励在 Java EE 容器中生成线程?

c# - Linq Union 的问题行为?

C++ 对派生类型 vector 的引用

c++ - 避免频繁加锁

c++ - 如何在代码中重启一个多线程的C++程序?