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

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

    }

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()が間違っているようです。1つev_loopは、関数ではなく型です。

于 2012-01-27T15:56:39.083 に答える