我有一个使用lib事件的多线程C ++应用程序。接收全部发生在libevent进程中,然后设置一个标志,以便稍后处理接收的数据。在发送时,事情出错了。我在一个“主线程”中,汇编了要发送的数据,然后调用了以下函数。
int SocketWrapper :: SendData( const U8* buffer, int length )
{
if( m_useLibeventToSend )
{
bufferevent* bev = GetBufferEvent();
struct evbuffer* outputBuffer = bufferevent_get_output( bev );
evbuffer_lock( outputBuffer );
int result = evbuffer_add( outputBuffer, buffer, length );
evbuffer_unlock( outputBuffer );
return result;
}
return send( m_socketId, (const char* )buffer, length, 0 );
}
这个函数有时会在evbuffer_add调用时崩溃,但99.9%的时候它工作正常。这闻起来像一个并发错误,它可能与客户崩溃或即将到来有关。我确保在libevent初始创建套接字期间,我做了以下事情:
struct evbuffer* outputBuffer = bufferevent_get_output( GetBufferEvent() );
evbuffer_enable_locking( outputBuffer, NULL );
你有什么其他特殊初始化我应该做的概念吗?我不应该从我的主线程调用“SendData”而是将事件发送到bufferevent,以便发送应该在与libevent相同的过程中发生吗?
所有设计理念都是开放的。到目前为止,我的解决方法是不使用libevent来发送,而是直接写入套接字。
这种崩溃发生在发布和调试,VS 2008,libevent 2.0中。它在图书馆的深处,所以我将尝试在我的项目中包含c文件来尝试追踪我的问题,但也许有人在这里知道什么是错的。 : - )