gpt4 book ai didi

boost-thread - 雇用,libev和boost:threads

转载 作者:行者123 更新时间:2023-12-02 04:04:05 26 4
gpt4 key购买 nike

尝试使用hiredis和libev库编写一个简单的Redis客户端。
一切都进行得很好,除了停止事件循环-m_thread.join()刚刚卡住了。
将所有初始化工作移到新创建的线程上不会执行任何操作。

这是我的代码的一部分:

RedisSubscriber::Start(){
m_redis = redisAsyncConnect(m_addr.c_str(),m_port);
m_redis-> data =(void *)这个;

m_loop = ev_loop_new(EVFLAG_NOINOTIFY);
redisLibevAttach(m_loop,m_redis);
redisAsyncSetConnectCallback(m_redis,connectCallback);
redisAsyncSetDisconnectCallback(m_redis,disconnectCallback);
redisAsyncCommand(m_redis,subscriptionCallback,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);
}

无效RedisSubscriber::subscribeCallback(redisAsyncContext * c,无效* r,无效* privdata){

}

最佳答案

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

  • 设置一个boost::thread
  • ev_async的回调中,调用ev_async
  • ev_break调用ev_async_sendRedisSubscriber::Stop()监视程序是线程安全的-它使用内存屏障在线程之间进行同步。

  • 这将导致事件循环停止,并且 ev_async将返回。

    关于boost-thread - 雇用,libev和boost:threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8611126/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com