Boost thread Hiredis、libev和boost:线程

Boost thread Hiredis、libev和boost:线程,boost-thread,libev,Boost Thread,Libev,尝试使用hiredis和libev库编写一个简单的Redis客户端。 一切都进行得很顺利,除了停止事件循环-m_thread.join()被卡住了。 将所有初始化内容移动到新创建的线程不会产生任何效果 以下是我的部分代码: void RedisSubscriber::Start() { m_redis = redisAsyncConnect(m_addr.c_str(),m_port); m_redis->data = (void*)this;

尝试使用hiredis和libev库编写一个简单的Redis客户端。 一切都进行得很顺利,除了停止事件循环-m_thread.join()被卡住了。 将所有初始化内容移动到新创建的线程不会产生任何效果

以下是我的部分代码:

void RedisSubscriber::Start() { m_redis = redisAsyncConnect(m_addr.c_str(),m_port); m_redis->data = (void*)this; m_loop = ev_loop_new(EVFLAG_NOINOTIFY); redisLibevAttach(m_loop, m_redis); redisAsyncSetConnectCallback(m_redis,connectCallback); redisAsyncSetDisconnectCallback(m_redis,disconnectCallback); redisAsyncCommand(m_redis, subscribeCallback, NULL, "SUBSCRIBE %s", m_channel.c_str()); m_thread = boost::thread(ev_loop,m_loop,0); } void RedisSubscriber::Stop() { redisAsyncFree(m_redis); m_thread.join(); m_redis = 0; } void RedisSubscriber::connectCallback(const redisAsyncContext *c) { } void RedisSubscriber::disconnectCallback(const redisAsyncContext *c, int status) { RedisSubscriber* r = (RedisSubscriber*)(c->data); ev_unloop(r->m_loop,EVUNLOOP_ALL); } void RedisSubscriber::subscribeCallback(redisAsyncContext *c, void *r, void *privdata) { } 无效订阅服务器::开始(){ m_redis=redisAsyncConnect(m_addr.c_str(),m_port); m_redis->data=(void*)这个; m_loop=ev_loop_new(EVFLAG_nonotify); redisLibevAttach(m_循环,m_redis); redisAsyncSetConnectCallback(m_redis,connectCallback); redisAsyncSetDisconnectCallback(m_redis,disconnectCallback); redisAsyncCommand(m_redis,subscribeCallback,NULL,“订阅%s”,m_channel.c_str()); m_-thread=boost::thread(ev_-loop,m_-loop,0); } 无效订阅服务器::停止(){ redisAsyncFree(m_redis); m_thread.join(); m_redis=0; } void RedisSubscriber::connectCallback(const redisAsyncContext*c){ } void RedisSubscriber::disconnectCallback(const redisAsyncContext*c,int status){ RedisSubscriber*r=(RedisSubscriber*)(c->数据); ev_卸载(r->m_循环,ev_卸载全部); } void RedisSubscriber::subscribeCallback(redisAsyncContext*c、void*r、void*privdata){ }
您使用的
boost::thread()
似乎不正确。首先,
ev\u loop
是一种类型,而不是一个函数。

假设您的
boost::thread的
ev\u run
,下面是您可以做的:

  • 设置一个
    ev\u async

  • ev\u async
    的回调中调用
    ev\u break

  • RedisSubscriber::Stop()
    调用
    ev\u async\u send
    ev_async
    watchers是线程安全的——它使用内存屏障在线程之间进行同步

  • 这将导致事件循环停止,
    m_thread.join()
    将返回