-levent -levent_pthreads

在使用了下面的代码时,会需要线程库

evthread_use_pthreads();
base = event_base_new();
evthread_make_base_notifiable(base);

libevent针对win32平台定义了evthread_use_windows_threads,

libevent针对Linux thread库 定义了evthread_use_pthreads

使用libevent时为了保证线程安全,提供了evthread_use_pthreads函数

他的内部是会分配内存的,但是没有对应的函数来反释放evthread_use_pthreads分配的内存,那么在如下的场景用evthread_use_pthreads就会造成内存泄露

libevent被编译为静态库然后被链接进了一个动态库A,我们在使用dlopen来加载静态库A,在使用时库A的内部是调用了evthread_use_pthreads的,会被分配内存出来,然后使用dlclose卸载掉库A,但是这里evthread_use_pthreads分配的内存并没有被释放掉!!!!然后又用dlopen来加载库A,这时其内部对evthread_use_pthreads的调用会不会分配新的内存,答案是会的,因为之前是整个把A卸载掉了。

如果不卸载掉A库,反复调用evthread_use_pthreads是不会造成泄露的,因为由全局变量在判别是否已经初始化了,但是卸载掉库后全局变量也就不存在了,再次加载全局变量依旧被初始化为0,evthread_use_pthreads会分配内存

当然,我们大多时候只会加载一次库

本文链接地址:https://const.net.cn/507.html

标签: none

添加新评论