gpt4 book ai didi

c++ - 在并发运行时中,我可以将 parallel_invoke 或 task_group 与非常量函数对象一起使用吗?

转载 作者:行者123 更新时间:2023-11-30 04:37:00 26 4
gpt4 key购买 nike

我在 Visual C++ 2010 中使用并发运行时,并且对 parallel_invoke 的功能感兴趣和 task_group (PPL 的一部分或 Parallel Patterns Library )。我希望能够通过函数对象(而不是 lambda 函数或函数指针)启动两个并行操作,但由于错误,我无法编译代码:

error C3848: expression having type 'const C' would lose some const-volatile qualifiers in order to call 'void C::operator ()(void)'

但是如果我将 C::operator()() 设置为常量,那么我将失去函数对象的很多好处,即它的状态是可变的并且在调用之间在内部维护。我在这里错过了什么吗?有没有一种方法可以并行调用非常量函数对象?

顺便说一句,我意识到我可以使用 Asynchronous Agents Library ,并从 Concurrency::agent 类派生类,但请考虑超出此问题的范围(部分原因是缺少异常处理和取消选项)。

我只是对我可以使用 PPL 做什么感兴趣,虽然有 lambda 函数和函数指针的示例,但我找不到或创建任何带有函数对象的示例,这些示例除了并行的“Hello World” ”。我正在寻找真正利用函数对象的东西,如果可能的话,还有并发容器。

最佳答案

仿函数必须是不可变的,因为当它们通过 parallel_invoke 和 task_group::run 进行调度时,它们会被复制,并且在状态累积期间出现竞争条件的可能性很高。特别是对于 task_group::run,任务的生命周期有可能比任务声明的地方长(即您在堆栈上声明它并且堆栈退出但任务尚未运行)

可用于解决此问题的最简单技术是在 lambda 中通过引用捕获仿函数(是的,我知道您说过您不想直接使用 lambda)。

   NonConstFunctor func;
Concurrency::task_group tasks;
// c3848
//tasks.run(func);
//work around this by capturing func by reference
tasks.run([&func](){func();});

您还可以使用调度程序类的“轻量级任务”功能(请参阅 Scheduler::ScheduleTask),它不需要 const,因为它具有典型的 void* API。

你需要构建一个包装函数来处理这个,但这很简单,样本包中有一个在 http://code.msdn.com/concrtextras

-瑞克

关于c++ - 在并发运行时中,我可以将 parallel_invoke 或 task_group 与非常量函数对象一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4167150/

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