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