【问题标题】:Sample code for asynchronous programming in CC 中异步编程的示例代码
【发布时间】:2011-01-07 17:08:29
【问题描述】:

我需要编写异步 ODBC 驱动程序,它需要以异步方式处理用户请求的 ODBC API。我很想知道如何编写一个可在所有平台上移植的异步程序。 能否请您提供一个关于如何正确处理异步代码的基本 C 代码?

提前致谢。

【问题讨论】:

    标签: asynchronous


    【解决方案1】:

    tidy code for asynchronous IO 是一个很好的起点。

    便携式解决方案实际上并不存在。对于所有平台上的套接字流和文件,它也有所不同。

    libevent 是一个很好的抽象。

    编写 ODBC 不适合胆小的人。

    【讨论】:

    • ODBC 实际上非常简单。
    • 取决于从业者,尼尔。
    【解决方案2】:

    以下面为例,注意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三种类型。

    棘手的是最后两个高度相关,这是为什么呢?

    也许一张图可以清楚地说明,即

    【讨论】:

    • 非常实用的例子帮助我理解!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2019-09-25
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2010-11-25
    相关资源
    最近更新 更多