事件驱动编程模式下C代码什么时候中断?
When does a C code interrupt in event driven programming mode ?
我是 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
发生,打印正常
案例 2.
首先event1
发生然后some_func1
被调用,在它中间,另一个event1
被调用,然后arr
被搞砸了。
- 情况2会发生吗?是否可以使 some_func1 成为原子
功能?
来自文档:
Dispatching events.
Finally, you call event_base_dispatch() to loop and dispatch events. You can also use event_base_loop() for more fine-grained control.
Currently, only one thread can be dispatching a given event_base at a time. If you want to run events in multiple threads at once, you can either have a single event_base whose events add work to a work queue, or you can create multiple event_base objects.
所以,如果你有一个线程和一个 event_base 那么 event_base_dispatch()/event_base_loop()在这个线程中调用handler函数一个一个地执行。
如果您有两个线程和两个 event_base(每个线程一个),那么它们将独立工作。第一个event_base在第一个线程中一个一个地处理它的事件;第二个 event_base 在第二个线程中一个接一个地处理它的事件。
(我没有使用过 libevent,但这通常是事件循环的工作方式)
我是 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
发生,打印正常
案例 2.
首先event1
发生然后some_func1
被调用,在它中间,另一个event1
被调用,然后arr
被搞砸了。
- 情况2会发生吗?是否可以使 some_func1 成为原子 功能?
来自文档:
Dispatching events.
Finally, you call event_base_dispatch() to loop and dispatch events. You can also use event_base_loop() for more fine-grained control.
Currently, only one thread can be dispatching a given event_base at a time. If you want to run events in multiple threads at once, you can either have a single event_base whose events add work to a work queue, or you can create multiple event_base objects.
所以,如果你有一个线程和一个 event_base 那么 event_base_dispatch()/event_base_loop()在这个线程中调用handler函数一个一个地执行。
如果您有两个线程和两个 event_base(每个线程一个),那么它们将独立工作。第一个event_base在第一个线程中一个一个地处理它的事件;第二个 event_base 在第二个线程中一个接一个地处理它的事件。
(我没有使用过 libevent,但这通常是事件循环的工作方式)