event_base_loop()
(发布者线程(和event_base_dispatch()
(订阅者线程(函数是线程安全的吗?最近,我使用valgrind's
helgrind
工具检查了我的应用程序是否存在任何同步错误。报告中提到,event_base_loop()
和event_base_dispatch()
之间存在竞争条件,即使这两个函数都是用不同的struct event_base
变量(struct event_base base_pub
(发布者线程(和struct event_base base_sub
(订阅者线程((调用的。下面是示例代码
Publisher线程
struct event_base base_pub = event_base_new();
while (true) {
... // publish data
event_base_loop(base_pub, EVLOOP_NONBLOCK);
sleep(1);
...
}
订阅线程
struct event_base base_sub = event_base_new();
while (true) {
... // register subscriber callback function
event_base_dispatch(base_sub);
...
}
如果您通过启用锁定/条件变量,它们是线程安全的
evthread_use_pthreads();
您还需要链接到libevent_pthreads
。注意:
在调用任何其他Libevent函数之前,您需要设置图书馆如果要在多线程应用程序,您需要初始化线程支持–通常使用evthread_use_pthreads((或evthread_use_windows_threads((。
当前,只有一个线程可以在时间如果要同时在多个线程中运行事件,可以或者具有其事件将工作添加到工作队列的单个event_ base,或者可以创建多个eventbase对象。