【发布时间】:2011-01-07 17:08:29
【问题描述】:
我需要编写异步 ODBC 驱动程序,它需要以异步方式处理用户请求的 ODBC API。我很想知道如何编写一个可在所有平台上移植的异步程序。 能否请您提供一个关于如何正确处理异步代码的基本 C 代码?
提前致谢。
【问题讨论】:
标签: asynchronous
我需要编写异步 ODBC 驱动程序,它需要以异步方式处理用户请求的 ODBC API。我很想知道如何编写一个可在所有平台上移植的异步程序。 能否请您提供一个关于如何正确处理异步代码的基本 C 代码?
提前致谢。
【问题讨论】:
标签: asynchronous
tidy code for asynchronous IO 是一个很好的起点。
便携式解决方案实际上并不存在。对于所有平台上的套接字流和文件,它也有所不同。
libevent 是一个很好的抽象。
编写 ODBC 不适合胆小的人。
【讨论】:
以下面为例,注意async多用于多线程,
// FILE NAME: a.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
typedef void (*pcb)(int a);
typedef struct parameter
{
int a;
pcb callback;
} parameter;
void *callback_thread(void *p1)
{
//do something
parameter *p = (parameter *)p1;
while (1)
{
printf("GetCallBack print! \n");
sleep(3); //delay 3s
p->callback(p->a);
}
}
extern int SetCallBackFun(int a, pcb callback)
{
printf("SetCallBackFun print! \n");
parameter *p = malloc(sizeof(parameter));
p->a = 10;
p->callback = callback;
pthread_t thing1;
pthread_create(&thing1, NULL, callback_thread, (void *)p);
pthread_join(thing1, NULL);
}
// FILE NAME: b.c
#include "boo.c"
#include <stdio.h>
void fCallBack(int a)
{
//do something
printf("a = %d\n",a);
printf("fCallBack print! \n");
}
int main(void)
{
SetCallBackFun(4,fCallBack);
return 0;
}
输出如下,
SetCallBackFun print!
GetCallBack print!
a = 10
fCallBack print!
GetCallBack print!
a = 10
fCallBack print!
GetCallBack print!
a = 10
fCallBack print!
GetCallBack print!
a = 10
fCallBack print!
GetCallBack print!
a = 10
fCallBack print!
GetCallBack print!
...
在调用函数方面,有sync、back、async三种类型。
棘手的是最后两个高度相关,这是为什么呢?
也许一张图可以清楚地说明,即
【讨论】: