acl
acl copied to clipboard
redis事件无法unsubscribe
开一个线程A调用subscribe监听事件,并用get_message获取消息。 再开另外一个线程B来unsubscribe这个监听。unsubscribe函数会无法返回,且线程B一直无法join退出。
以下是测试代码,请教下是代码错了,还是API用法错了。。 @zhengshuxin
static acl::string __channel_prefix("test_channel");
static bool test_subscribe(acl::redis_pubsub& redis, int n)
{
acl::string channel1, channel2;
for (int i = 0; i < n; i++)
printf(">>>%d\n", i);
redis.clear();
printf(">>>start subscribe\n");
int ret = redis.subscribe(__channel_prefix.c_str(), NULL);
if (ret <= 0){
printf("subscribe error(%s), ret: %d\r\n",
redis.result_error(), ret);
return false;
}
printf(">>>subscribe OK\n");
auto msg_thread = std::thread([&](void){
while(true){
printf(">>>receiving....\n");
acl::string msg;
if ((redis.get_message(__channel_prefix, msg)) != false)
printf("receive message %s\n", msg.c_str());
else
break;
}
});
printf(">>>start to unsubscribe\n");
redis.clear();
ret = redis.unsubscribe(__channel_prefix.c_str(), NULL);
if (ret <= 0)
{
printf("unsubscribe error(%s), ret: %d\r\n",
redis.result_error(), ret);
}
printf(">>>unsubscribe ok \n");
msg_thread.join();
return true;
}
后来怎么样了