3

尝试使用hiredis 和libev 库编写一个简单的Redis 客户端。一切都很顺利,除了停止事件循环 - m_thread.join() 刚刚卡住。将所有初始化的东西移到新创建的线程上什么都不做。

这是我的代码的一部分:

    无效的 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);
    }

    无效 RedisSubscriber::Stop() {
        redisAsyncFree(m_redis);
        m_thread.join();
        m_redis = 0;
    }

    无效 RedisSubscriber::connectCallback(const redisAsyncContext *c) {

    }

    无效 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) {

    }

4

2 回答 2

1

假设您的意思ev_run是您boost::thread的 ,您可以执行以下操作:

  1. 设置一个ev_async

  2. ev_asynccall的回调中ev_break

  3. ev_async_send从调用RedisSubscriber::Stop()ev_async观察者是线程安全的——它使用内存屏障在线程之间进行同步。

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

于 2014-07-20T16:28:18.487 回答
0

看来您的使用boost::thread()不正确。一方面,ev_loop是一种类型,而不是一种功能。

于 2012-01-27T15:56:39.083 回答