【问题标题】:Has the C++1y standard considered to support coroutine/goroutine?C++1y 标准是否考虑支持协程/协程?
【发布时间】:2014-03-11 05:39:18
【问题描述】:

我认为 coroutine/goroutine 在需要快速执行大量并发小任务的情况下非常有用。目前的std::thread成本高,无法满足要求。

我也觉得 coroutine/goroutine 不能简单地通过 C++ 库来支持,它应该直接通过语言的核心特性来实现。因为 coroutine/goroutine 具有特殊的语义,在当前的 C++ 标准中没有对应的概念。

如果我们添加一个新的关键字cppgo,那么我们可以编写如下代码:

void f(int n)
{
    ...
}

int main()
{
    for (int i = 0; i < 10000; ++i)
    {
        cppgo f(i);
    }
}

那该有多酷!

C++1y 标准是否考虑支持协程/goroutine?

【问题讨论】:

  • 嗯,是的,也许这很酷,但是有什么规则呢?您显然不希望在范围结束时进行破坏/等待,因为这样就不会并行执行任何操作。你想要的是一种parallel_forstd::async,它带有一个低级机制来决定事情是否真的在别处完成。
  • 如有必要,我们可以对协程施加新规则。最重要的是,协程在云计算中非常有用。这是一个非常需要的功能。
  • 是的,新规则是可能的,但我说的是一个相当强大的规则:范围。另一件事:如果f 返回的不是void,会发生什么?返回值会发生什么?您真的希望那里有明确定义的行为,尤其是在范围方面。只需使用异步。它的默认启动策略是“这里或其他地方”,所以基本上就是你需要的。
  • 我认为您低估了添加这些“特殊规则”的工作量。此外,创建从根本上与现有规则相矛盾的新规则是一件相当大的事情,尽管它可能很有用。人们期望东西在范围退出时被销毁。这是您与该语言签订的“合同”的一部分。您的代码的一个相当轻量级的版本是创建一个线程池。
  • 协程不等同于 goroutine。相反,使用协程的纤维(这是一种轻量级线程)在内部提供了与 goroutine 类似的设施。 N3708 提案建议使用 C++ 协程。

标签: c++ standards coroutine c++14 goroutine


【解决方案1】:

有几个与协程相关的提案,但它们的目标不是 C++14,而是更高版本。以下是其中的一些建议:

还有其他或多或少相关的论文(查看并发相关论文和未来相关论文,您会发现允许使用协程的趋势)。

有些人还讨论了为“unwrapping monads”提供通用语法的可能性(例如 1 中提出的 await 关键字),它适用于 std::future 和其他非并发相关类型,如 @987654335 @ 或 expected。这样的特性将允许将相同的算法无缝地应用于可恢复和不可恢复的功能,无论是否涉及并发。至少在理论上。

以下是与这些协程和 monad 概念相关的讨论列表,由人们提出和批评这些建议:

【讨论】:

    猜你喜欢
    • 2012-07-09
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2018-04-16
    • 2013-02-18
    相关资源
    最近更新 更多