mengunci io watcher dan timer watch di libev

di libev, saya telah menginisialisasi pengamat io untuk menangkap peristiwa dan peristiwa ini menyebabkan nilai tertentu disimpan di beberapa cache. Saya memiliki pengamat pengatur waktu lain yang berjalan setiap 10 detik, membaca nilai cache. Dalam hal ini saya kira ada kondisi balapan. apakah saya perlu menggunakan kunci di dua pengamat libev yang berbeda atau libev yang menanganinya.

eg:

 TCP_CACHE_TIMEOUT = g_hash_table_new_full(g_str_hash, g_int_equal, key_destroy_cb, value_destroy_timeoutcb);
    zlog_info(_c,"TCP Server started at _port: %d",_port);
    int fd =setup_tcp_socket(_port);
    if(fd<0)
    {
        return NULL;
    }

    struct ev_loop *loop = EV_DEFAULT;

    struct _sock_ev_serv server;
    server.fd = fd;
    ev_io_init(&server.io, event_server, server.fd, EV_READ);
    ev_io_start(EV_A_ &server.io);

    ev_timer_init (&timeout_watcher, timeout_idle_fd, 0, 10.);
    ev_timer_again (loop,&timeout_watcher);

    ev_loop(loop, 0);  

di sini saya memiliki loop dan menginisialisasi io watcher untuk menerima acara server, dan timer watcher untuk mencari di cache setiap 10 detik. Dalam kasus seperti itu Apakah saya perlu menangani sendiri kondisi balapan atau dua pengamat io dan waktu berjalan diatur oleh libev?


person user5335302    schedule 15.01.2016    source sumber


Jawaban (1)


Jawaban singkatnya: Tidak ada kondisi balapan, tidak perlu kunci.

Jawaban yang lebih panjang:
Alasan tidak ada kondisi balapan, adalah karena libev berada dalam satu loop memeriksa io watcher, lalu timer, lalu io, lalu timer.....
Yang mana saja dipicu terlebih dahulu, dijalankan terlebih dahulu. Tidak ada tumpang tindih antara kedua panggilan balik tersebut.

Namun jika, Anda menggunakan loop peristiwa berulir (mungkin, tetapi tidak mungkin dilihat dari kode Anda), dan Anda membaca dari file yang sama di dua thread berbeda, maka akan ada kondisi balapan dan Anda memerlukan kunci.

Contoh:
Jika Anda mendapatkan data di io watcher setelah 0,9 detik, dan callback Anda untuk watcher tersebut memerlukan waktu 0,2 detik untuk berjalan, timer Anda akan dipanggil setelah callback io selesai (pada ~10,1 detik).

person Community    schedule 11.02.2016