2011-12-23 6 views
3

hiredisおよびlibevライブラリを使用して簡単なRedisクライアントを書き込もうとしています。 イベントループを停止する以外はすべてうまくいっています - m_thread.join()はちょうど立ち往生しました。 新しく作成されたスレッドにすべての初期化項目を移動することは何もしません。ここでHiredis、libev、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()の使用が間違っているようです。 1つは、ev_loopはタイプであり、関数ではありません。

0

ここにあなたが何ができるかだ、あなたはboost::threadためev_runを意味すると仮定すると:

  1. セットアップev_asyncコールev_breakのコールバックでev_async

  2. ev_async_sendからRedisSubscriber::Stop()に電話する。 ev_asyncウォッチャーはスレッドセーフです。スレッド間の同期にはメモリバリアが使用されます。

これにより、イベントループが停止し、m_thread.join()が返されます。

関連する問題