acl icon indicating copy to clipboard operation
acl copied to clipboard

redis事件无法unsubscribe

Open stevexxs opened this issue 6 years ago • 2 comments

开一个线程A调用subscribe监听事件,并用get_message获取消息。 再开另外一个线程B来unsubscribe这个监听。unsubscribe函数会无法返回,且线程B一直无法join退出。

stevexxs avatar Mar 29 '19 13:03 stevexxs

以下是测试代码,请教下是代码错了,还是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;
}

stevexxs avatar Apr 01 '19 09:04 stevexxs

后来怎么样了

ichao1214 avatar Apr 28 '19 13:04 ichao1214