实现类似以下内容的明智方法是什么?
\n// Plain C function for example purposes.\nvoid sleep_async(delay_t delay, void (* callback)(void *), void * data);\nRun Code Online (Sandbox Code Playgroud)\n即延迟后异步执行回调的一种手段。例如,POSIX 有一些函数可以执行类似的操作,但它们主要用于异步 I/O(请参阅此了解我的意思)。根据该手册页,我对这些函数感兴趣的是它们如何“好像”在新线程上执行,其中实现可以选择生成“单个线程......以接收所有通知”。我知道有些人可能仍然选择为每个线程生成一个完整的线程,并且像这样的东西可能需要操作系统本身的支持,所以这只是一个例子。
\n我已经有几种方法可以实现这一点(例如,按定时器循环上的唤醒时间排序的事件优先级队列,根本不需要启动线程),但我想知道是否已经存在 smart[er] 或[更多]我想要完成的事情的完整实现。例如,也许Task.Delay()C\xe2\x99\xaf 的实现(以及其他语言环境中的协程)在最小化线程生成量以获得异步延迟方面做了一些聪明的事情。
我为什么要寻找这样的东西?正如标题所暗示的,我正在寻找异步的东西。上面的签名只是一个简单的 C 示例,大致说明了 POSIX 的作用。我正在实现一些 C++20 协程,供与朋友一起使用co_await,以及线程池等。安排任何最终会同步等待某事的事情可能是一个坏主意,因为它会阻止其他空闲线程执行任何工作。生成[并可能立即分离]一个新线程只是为了添加异步延迟似乎也不是一个非常聪明的想法。我的计时器循环想法可能没问题,但这意味着需要预定义的计时器粒度以及优先级队列的开销。
编辑
\n正如评论者提到的那样,我忽略了任何真正的目标平台集。我不希望针对“常用”桌面平台之外的任何东西,因此嵌入式开发的怪癖被忽略。我计划以这种方式使用异步延迟本身的方式不一定需要线程支持(一切都可以只在计时器循环上),但仍然需要并一致使用线程(即调度协程的线程池)。
\n简单但低效的方法是生成一个线程,让它休眠delay,然后调用回调。只需几行即可完成此操作std::async():
auto delayed_call = std::async(std::launch::async, [&]{
std::this_thread::sleep_for(delay);
callback(data);
});
Run Code Online (Sandbox Code Playgroud)
正如 Thomas Matthews 所提到的,这需要对线程的支持。虽然对于一次性呼叫来说没问题,但如果有很多这样的延迟呼叫,效率就很低了。正如您已经提到的,拥有优先级队列和事件循环或专用线程来处理该队列中的事件可能是最有效的方法。如果您正在寻找实现此功能的库,请查看boost::asio.
至于使用 C++20 协程,我不认为这会让像你这样的事情变得sleep_async()更容易。然而,可以在其之上实现事件循环。
| 归档时间: |
|
| 查看次数: |
831 次 |
| 最近记录: |