gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:39:04 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com