我目前有一些同步 C++ 代码,它们以顺序方式执行一些耗时的任务。我正在考虑使用 Boost 协程将其重构为并行任务。
任务的核心是对外部库的调用,该库提供同步 API(它当前正在使用)或异步 API,必须定期轮询以执行操作并确定操作是否已完成。API 不是线程安全的,但如果使用异步版本,只要轮询 API 本身不被并发调用,它就可以处理同时发生的多个请求。
(因为我不想要任何线程转移,看来我应该直接使用协程 API 而不是使用 ASIO 包装器或类似的,但我愿意被说服。我现在也在使用 Boost 1.55 ,因此 Fiber 库不可用;但这种用法似乎也有点过头了。)
目前我对协程的主要问题是我不确定如何在轮询中实现节流——假设我有 100 个任务要并行运行;我希望它对所有 100 个任务进行一次轮询,然后让线程休眠指定的时间。一些任务可能比其他任务完成得更快,因此稍后它可能仍会在每个循环中轮询 40 个任务,然后休眠相同的时间。我不希望它在没有干预睡眠的情况下连续两次轮询同一任务。