2011-12-23 61 views
3

嘗試使用hiredis和libev庫編寫簡單的Redis客戶端。 一切都進展順利,除了停止事件循環 - m_thread.join()剛剛卡住。 將所有初始化的東西移動到新創建的線程中什麼也不做。Hiredis,libev and boost:threads

這裏是我的代碼部分:

 

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

    } 

回答

0

看來你的boost::thread()使用不正確。首先,ev_loop是一種類型,而不是函數。

0

假設你的意思是ev_runboost::thread,這裏是你可以做什麼:

  1. 設置的ev_async

  2. ev_async電話ev_break的回調。

  3. 致電ev_async_sendRedisSubscriber::Stop()ev_async觀察者是線程安全的 - 它使用內存屏障來進行線程之間的同步。

這將導致事件循環停止,並且m_thread.join()將返回。