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;
}
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) {
}