【问题标题】:What to do instead of async/await in a systems language用系统语言代替 async/await 做什么
【发布时间】:2022-01-14 06:22:41
【问题描述】:

我有一个具体问题,在高级语言中我可以使用 async/await 来解决:我们有一个阻塞的系统/硬件通信/网络调用,需要几秒钟才能完成。我们希望在并行执行其他一些此类调用时在后台发生这种情况。

我已经想到了几个解决方案,可能还有比这些更好的解决方案:

  1. 启动线程并在条件变量/信号量完成后发出信号 完成;

  2. 提供在调用完成时执行的回调 (旧的 JavaScript 风格);

  3. 创建您自己的自定义调度程序以 实际上模仿 async/await。

在 Odin 或 C 等系统语言中,解决此问题的理想方案是什么?

【问题讨论】:

  • 所有这些都是有效的解决方案,“最佳”解决方案将取决于您的确切需求。这个问题真的不能简单回答
  • 如果有一个理想的解决方案,就不会发明 async/await :) 这三个都是可行的解决方案,甚至是混合解决方案。
  • 感谢您的快速cmets。我可能会错过任何第四种方式吗?
  • 在做其他事情的一小部分时进行轮询,但这可能是你的 3 的一个特别肮脏的变体。
  • 不要重新发明那个轮子,它会是方形的。 Libuv 很受欢迎。

标签: c multithreading async-await


【解决方案1】:

我建议使用您的系统/语言中最常见的异步方法。我不建议使用单独的线程,也不建议尝试将高级风格的异步编程移植到低级语言/平台中。您希望您的消费者使用他们觉得很自然的东西,而不是学习一个全新的范例来调用您的 API。

如果您使用的是 Windows,您应该能够在完成时发送 ManualResetEvent 信号。显式回调也是可以接受的。

我还没有在 Linux 上编写异步代码,但我怀疑采用 libevent 或 libuv 会是一条路。

如果您要公开一个 API 供其他人使用,并且希望它感觉最像平台,我相信您必须在驱动程序级别这样做。这使您可以完全实现支持 OVERLAPPED(在 Windows 上)或 epoll(在 Linux 上)。

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 2015-07-04
    • 2020-02-05
    • 1970-01-01
    • 2011-05-05
    • 2019-06-12
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多