Когда код C прерывает режим программирования, управляемого событиями?

Я новичок в c и программировании, управляемом событиями.

Мы используем libevent для разработки

  1. как работает прерывание и когда оно происходит?
  2. Будет ли он прерываться в середине функции или всегда прерывается в конце функции?

Например,

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 перепутывается.

  1. Произойдет ли случай 2? Можно ли сделать some_func1 атомарной функцией?

person Sato    schedule 04.09.2017    source источник


Ответы (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, но обычно так работают циклы событий)

person Velkan    schedule 04.09.2017