异步c api设计的最佳实践

时间:2011-01-25 21:59:58

标签: c api-design

我即将为某些功能设计一个C api,我想让它异步,因为暴露的功能可能需要一些时间。使用阻塞api可能不是一个好主意,因为api的用户需要同时进行多次调用。

设计界面的正确方法是什么,以便我可以通知用户异步操作已完成?

我可以想到几种不同的方法,但我不能说我知道这方面的最佳做法。有没有人有类似API的经验:s?

在这个例子中,目的是返回一个包含答案的int。

回调功能:

typedef void (*callback_function)(int, void *);

/* Calls the callback function with the answer and cookie when done */
error_code DoSomething(callback_function, void *cookie);

轮询:

error_code DoSomething(void *cookie);

/* Blocks until any call has completed, then returns the answer and cookie */
error_code WaitForSomething(int *answer, void **cookie);

平台特定事件队列

/* Windows version, the api calls PostQueuedCompletionStatus when done */
error_code DoSomething( HANDLE hIoCompletionPort,
                        ULONG_PTR dwCompletionKey,
                        LPOVERLAPPED lpOverlapped );

此API的用户通常是事件驱动的,因此下面的设计可能不是一个好主意。

期货:

/* External dummy definition for a future */
struct Future_Impl {
    int unused;
};
typedef Future_Impl *Future;

/* Initializes a future, so that it can be waited on later */
error_code DoSomething(Future *future);

/* Blocks until the result is available */
error_code WaitForSomething(Future future, int *answer);

平台特定"期货" /事件:

/* Windows version, the api signals the event when done */
error_code DoSomething( HANDLE hEvent, int *answer );

/* Can be waited on using WaitForMultipleObjects,
   but that has a limit on how many events that can be used */

2 个答案:

答案 0 :(得分:1)

我会将回调函数作为基本构建块。我已经看过这个设计多次使用它的确有效。 void指针允许您传递一些上下文,而另一个回调参数通常是错误代码。您可以在此基础上构建其他图层,例如状态机,事件队列或在上下文中传递OS同步对象。

答案 1 :(得分:0)

我意识到你已经要求了一个特定的场景,但就设计C接口而言,我听到了关于这本书的非常积极的评论,并且通常听到它首先推荐类似于你的问题:C Interfaces and Implementations: Techniques for Creating Reusable Software