libevent-bufferevent遇到的坑

1. 多线程操作段错误

int evbuffer_enable_locking(struct evbuffer *buf, void *lock);
void evbuffer_lock(struct evbuffer *buf);

对evbuffer加锁,先确保安全,再优化效率

2.  对evbuffer加锁后还是段错

struct bufferevent *bufferevent_socket_new
    (struct event_base *base, evutil_socket_t fd, int options);

 在options参数中加入BEV_OPT_THREADSAFE,否则对锁evbuffer_lock()的操作无效

3. 在2情况下创建的buffeevent为nullptr

evthread_use_pthreads(); // linux
evthread_use_windows_threads(); // windows

在设置BEV_OPT_THREADSAFE前,加入此段说明

4. 非必须,但建议加入水位线控制

void bufferevent_setwatermark
    (struct bufferevent *bufev, short events,
     size_t lowmark, size_t highmark);

题外话

不建议心跳包和数据通信共用一个socket。

如果数据包特大,接收时间很长,甚至超过缓冲区大小,会收不到心跳包

你可能感兴趣的:(C++,libevent,c++,libevent)