当尝试实现异步API调用/非阻塞调用时,我在一个所有Plain-C应用程序中知道一点,我通过'Delegates'读了一篇关于APM(异步编程模型)的文章。基本上我想要做的是调用一个API f1()
来执行一项功能(需要很长时间8-10秒),所以我称之为API f1()
,忘了它,继续做其他的工作,例如I / O用于获取f1()
的下一次调用的数据或某些不依赖于f1()
的结果的功能。
如果有人使用该APM编程模型,我正在寻找一些实现非阻塞调用的简明解释。
是否有其他方法可以实现异步API,其他任何可能对此有帮助的库/框架?
答案 0 :(得分:1)
您基本上需要创建一个多线程(或多进程)应用程序。 f1()API需要生成一个线程(或进程)来处理单独执行空间中的数据。完成后,f1()例程需要通知执行完成的主进程(signal(),消息队列等)。
答案 1 :(得分:1)
在普通C程序中进行异步编程的一种流行方法是使用“事件循环”。您可以使用许多库。我建议看看 glib
另一种方法是使用多个抢先线程(每个并发操作一个)并将它们与互斥锁和条件变量同步。但是,普通C中的先发制人线程是我要避免的,特别是如果你想编写可移植程序。很难知道哪些库函数是可重入的,线程程序中的信号处理是一件麻烦事,而且通常C库和系统函数都是为单线程使用而设计的。
如果您计划仅在一个平台(如Windows)上运行应用程序,并且使用f1()完成的工作相对简单,那么线程就可以了。
答案 2 :(得分:1)
如果你所指的函数f1()本身不以异步方式实现,你需要自己将它包装在自己的线程中。执行此操作时,您需要注意可能由调用的特定函数引起的副作用。许多库不是以线程安全的方式设计的,并且来自这些库的多个并发函数调用将导致数据损坏。在这种情况下,您可能需要在外部工作进程中包含该功能。对于繁重的提升,你提到(8-10秒),开销是可以接受的。如果您一次只在一个线程中使用外部非线程安全函数,则可能是安全的。
使用任何形式的事件循环的问题是,一个不知道你的循环的外部函数永远不会控制回你的循环。因此,你不会做任何其他事情。
答案 3 :(得分:0)
用C中函数的指针替换委托,其他所有内容基本上与你读过的内容相同。
答案 4 :(得分:0)