异步API

时间:2008-09-15 12:26:00

标签: c asynchronous api

当尝试实现异步API调用/非阻塞调用时,我在一个所有Plain-C应用程序中知道一点,我通过'Delegates'读了一篇关于APM(异步编程模型)的文章。基本上我想要做的是调用一个API f1()来执行一项功能(需要很长时间8-10秒),所以我称之为API f1(),忘了它,继续做其他的工作,例如I / O用于获取f1()的下一次调用的数据或某些不依赖于f1()的结果的功能。

如果有人使用该APM编程模型,我正在寻找一些实现非阻塞调用的简明解释。

是否有其他方法可以实现异步API,其他任何可能对此有帮助的库/框架?

5 个答案:

答案 0 :(得分:1)

您基本上需要创建一个多线程(或多进程)应用程序。 f1()API需要生成一个线程(或进程)来处理单独执行空间中的数据。完成后,f1()例程需要通知执行完成的主进程(signal(),消息队列等)。

答案 1 :(得分:1)

在普通C程序中进行异步编程的一种流行方法是使用“事件循环”。您可以使用许多库。我建议看看 glib

另一种方法是使用多个抢先线程(每个并发操作一个)并将它们与互斥锁和条件变量同步。但是,普通C中的先发制人线程是我要避免的,特别是如果你想编写可移植程序。很难知道哪些库函数是可重入的,线程程序中的信号处理是一件麻烦事,而且通常C库和系统函数都是为单线程使用而设计的。

如果您计划仅在一个平台(如Windows)上运行应用程序,并且使用f1()完成的工作相对简单,那么线程就可以了。

答案 2 :(得分:1)

如果你所指的函数f1()本身不以异步方式实现,你需要自己将它包装在自己的线程中。执行此操作时,您需要注意可能由调用的特定函数引起的副作用。许多库不是以线程安全的方式设计的,并且来自这些库的多个并发函数调用将导致数据损坏。在这种情况下,您可能需要在外部工作进程中包含该功能。对于繁重的提升,你提到(8-10秒),开销是可以接受的。如果您一次只在一个线程中使用外部非线程安全函数,则可能是安全的。

使用任何形式的事件循环的问题是,一个不知道你的循环的外部函数永远不会控制回你的循环。因此,你不会做任何其他事情。

答案 3 :(得分:0)

用C中函数的指针替换委托,其他所有内容基本上与你读过的内容相同。

答案 4 :(得分:0)

好。基本上我见过两种类型的异步API:

  1. 中断。您给呼叫打电话应该在通话后执行。 GIO(前面提到的GLib的一部分)以这种方式工作。编程相对容易但你通常会在其中运行回调的线程发生变化(除非它与主循环集成,如GIO的情况)。
  2. 民意测验。您检查数据是否可用。众所周知的BSD插座以这种方式运行。它的优点是不必与主循环集成并在特定线程中运行回调。
  3. 如果您为Gnome或Gtk +编程,我想补充说GTask似乎是一个非常好的(可能很好吗?我还没用过它)。 Vala将更好地支持类似GIO的异步调用。