事件驱动编程模式下C代码啥时候中断?

Posted

技术标签:

【中文标题】事件驱动编程模式下C代码啥时候中断?【英文标题】:When does a C code interrupt in event driven programming mode ?事件驱动编程模式下C代码什么时候中断? 【发布时间】:2017-09-04 08:30:33 【问题描述】:

我是 c 和事件驱动编程的新手。

我们正在使用 libevent 开发

    中断是如何工作的,何时发生? 它会在函数中间中断,还是总是 在函数结束时中断?

例如,

extern int arr[100];

void some_func1() 
    int flag;
    // do something to change flag
    if(flag == 0) 
        update1(arr);
    else if(flag == 1) 
        update2(arr);
    


void some_func2() 
    // print something based on arr

some_func1 将在 event1 发生时被调用,some_func2 将被调用 如果event2 发生。

案例 1. 首先出现event1,然后调用some_func1并完成,所以arr正确更新,然后出现event2,打印就ok了

案例 2. 先出现event1,然后调用some_func1,中间又调用了event1,然后arr搞砸了。

    案例 2 会发生吗?是否可以使 some_func1 成为原子 功能?

【问题讨论】:

【参考方案1】:

来自文档:

调度事件。

最后,您调用 event_base_dispatch() 来循环和分派事件。您还可以使用 event_base_loop() 进行更细粒度的控制。

目前,一次只能有一个线程调度给定的event_base。如果您想同时在多个线程中运行事件,您可以使用单个 event_base 其事件将工作添加到工作队列中,或者您可以创建多个 event_base 对象。

所以,如果你有一个线程和一个 event_base,那么 event_base_dispatch()/event_base_loop() 在这个线程调用处理函数中会一一对应。

如果您有两个线程和两个 event_base(每个线程中一个),那么它们独立工作。第一个 event_base 在第一个线程中一个一个地处理它的事件;第二个 event_base 在第二个线程中一一处理其事件。

(我没有使用过 libevent,但事件循环通常是这样工作的)

【讨论】:

以上是关于事件驱动编程模式下C代码啥时候中断?的主要内容,如果未能解决你的问题,请参考以下文章

Python并发编程-事件驱动模型

事件驱动模型

事件驱动编程

事件驱动

网络I/O模型

Linux的I/O模式事件驱动编程模型