当我尝试实现异步API调用/非阻塞调用时,我对我的纯C应用程序略知一二,我读了一篇由“Delegates”编写的关于APM (异步编程模型)的文章。基本上,我想要做的是调用一个f1()接口来完成一个功能(这需要很长的时间8-10秒),所以我调用这个接口f1(),忘记它,继续做一些其他的工作,例如I/O为下一次调用f1()获取数据,或者一些不依赖于f1()结果的功能。
如果有人使用过APM编程模型,我将查看一些关于实现非阻塞调用的简明解释。
有没有其他实现异步API的方法,或者其他可能对此有所帮助的库/框架?
发布于 2008-09-15 13:25:29
基本上,您需要创建一个多线程(或多进程)应用程序。f1() API需要派生一个线程(或进程)来在单独的执行空间中处理数据。当它完成时,f1()例程需要向主进程发出执行完成的信号( signal ()、消息队列等)。
发布于 2008-09-15 14:08:34
在普通C程序中进行异步编程的一种流行方法是使用“事件循环”。可以使用的库有很多。我建议去看看glib。
另一种选择是使用多个抢占式线程(每个并发操作一个),并将它们与互斥和条件变量同步。但是,我会避免使用普通C语言中的抢占式线程,特别是如果您想编写可移植程序的话。很难知道哪些库函数是可重入的,线程程序中的信号处理是一个麻烦,而且通常C库和系统函数都是为单线程使用而设计的。
如果您计划只在一个平台(如Windows)上运行您的应用程序,并且使用f1()完成的工作是相对简单的事情,那么线程处理也是可以的。
发布于 2008-09-30 11:47:57
如果您引用的函数f1()本身不是以异步方式实现的,则需要自己将其包装在自己的线程中。在执行此操作时,您需要注意被调用的特定函数可能导致的副作用。许多库都不是以线程安全的方式设计的,从这样的库中多次并发调用函数将导致数据损坏。在这种情况下,您可能需要在外部工作进程中包装该功能。对于你提到的重物(8-10秒),开销可能是可以接受的。如果一次只在一个线程中使用外部非threadsafe函数,则可能是安全的。
使用任何形式的事件循环的问题是,不知道您的循环的外部函数永远不会将控制权交还给您的循环。因此,您将无法执行其他任何操作。
https://stackoverflow.com/questions/62322
复制相似问题