如何取消 hiredis 阻塞操作

How to cancel hiredis blocking operation

本文关键字:hiredis 操作 取消 何取消      更新时间:2023-10-16

像下面这样运行阻塞订阅会在redisGetReply处停止程序(来源:hiredis#pipelining(

void subscribe (std::string& key, Subscriber* subscriber)
{
    void* reply = redisCommand (redis, "SUBSCRIBE %s", key.c_str ());
    freeReplyObject (reply);
    while (redisGetReply (redis, &reply) == REDIS_OK)
    {
        subscriber -> notify ();
        freeReplyObject (reply);
    }
}

我认为通过调用redisFree(通过信号处理(套接字将被关闭并返回redisGetReply,如 hiredis#clean-up 中所述,相反,它会引发内存访问违规。

好的,没关系。我设法通过调用来简单地关闭 hiredis 正在使用的文件描述符......

close (redis -> fd);

。并且redisGetReply正确返回。

或者,可以发送一个QUIT命令,阻止订阅返回。