根据libevent documentation,有一个使event_base
结构线程安全的功能:
EVENT2_EXPORT_SYMBOL int evthread_make_base_notifiabe(struct event_base* base)
文档还指出:" 你不应该手动调用它;使用线程支持配置基础应该是必要且充分的。"
有' S:
EVENT2_EXPORT_SYMBOL struct event_base* event_base_new_with_config(const struct event_config *)
EVENT2_EXPORT_SYMBOL int event_config_set_flag (struct event_config *cfg, int flag)
但我无法弄清楚如何配置event_base以获得与evthread_make_base_notifiable
相同的效果。有任何想法吗?
答案 0 :(得分:0)
如果你创建这样的事件库:
struct event_config* config = event_config_new();
if ((m_base = event_base_new_with_config(config)) == NULL)
{
cout << "Failed to create an event base";
}
event_config_free(config);
然后事件库将是线程安全的(至少event_add和event_base_once函数足以通过创建带有任务的事件并在正确的线程上运行它来消除线程安全问题。)
在http://www.wangafu.net/~nickm/libevent-book/Ref2_eventbase.html中写入您可以配置无锁标志(EVENT_BASE_FLAG_NOLOCK),因此默认情况下它被锁定。 所有这些可能与尚未引入锁定机制的旧版本的libevent无关。
答案 1 :(得分:0)
According to the Libevent book内,你有告诉Libevent使用哪些锁定函数。您可以根据您的平台调用evthread_use_windows_threads()
或evthread_use_pthreads()
来执行此操作。在调用任何需要在线程之间共享的结构的Libevent函数之前,您需要执行此操作。您还需要在链接器标志中添加-levent_thread
之类的内容。