redisAsyncCommand 中 privdata 参数的用途是什么?
What is the use of privdata argument in redisAsyncCommand?
源代码中为 redisAsyncCommand( ) 提供的函数定义是:
static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *cmd, size_t len) { ... }
void *privdata
参数的目的是什么?在什么情况下会有用?
我通过阅读 gihub 上的代码了解到,privdata 的目的是向您的回调发送一些预定义的数据(可以是任何东西;这就是使用 void* 的原因)。在您的回调中(fn 指向 redisCallbackFn 的指针)您将收到该 privdata 作为参数(例如查看 func __redisRunCallback
文件 async.c
中的 cb->fn(ac,reply,cb->privdata);
)
例如(类似的简化伪代码)如下所示。在此示例中,有 3 次连续调用 __redisAsyncCommandSimplified 并且只有一个处理程序(回调)。在回调中,我使用 privdata 来确定行为
打回来。您的回调还可以将该 privdata 数据用于其他用途(例如另一个函数调用、日志记录、结构 creation/population 等的参数)...
#include <stdio.h>
#include <string.h>
typedef void (*Callback)(int, void*);
int __redisAsyncCommandSimplified(Callback call, void* privdata) {
call(1, privdata);
return 1;
}
void myHandler(int status, void* privdata) {
char* str = (char*)privdata;
printf("%s = ", str);
if (strcmp (str, "john") == 0) {
printf("lennon");
}
else if (strcmp(str, "ringo") == 0) {
printf("star");
}
else if (strcmp(str, "ringo") == 0) {
printf("star");
}
else if (strcmp(str, "paul") == 0) {
printf("mccartney");
}
else if (strcmp(str, "george")) {
printf("harrison");
}
else {
printf("who?!?");
}
printf("\n");
}
int main()
{
char c[20];
strcpy(c, "john");
__redisAsyncCommandSimplified(myHandler, c);
strcpy(c, "paul");
__redisAsyncCommandSimplified(myHandler, c);
strcpy(c, "someone else");
__redisAsyncCommandSimplified(myHandler, c);
return 0;
}
源代码中为 redisAsyncCommand( ) 提供的函数定义是:
static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *cmd, size_t len) { ... }
void *privdata
参数的目的是什么?在什么情况下会有用?
我通过阅读 gihub 上的代码了解到,privdata 的目的是向您的回调发送一些预定义的数据(可以是任何东西;这就是使用 void* 的原因)。在您的回调中(fn 指向 redisCallbackFn 的指针)您将收到该 privdata 作为参数(例如查看 func __redisRunCallback
文件 async.c
中的 cb->fn(ac,reply,cb->privdata);
)
例如(类似的简化伪代码)如下所示。在此示例中,有 3 次连续调用 __redisAsyncCommandSimplified 并且只有一个处理程序(回调)。在回调中,我使用 privdata 来确定行为 打回来。您的回调还可以将该 privdata 数据用于其他用途(例如另一个函数调用、日志记录、结构 creation/population 等的参数)...
#include <stdio.h>
#include <string.h>
typedef void (*Callback)(int, void*);
int __redisAsyncCommandSimplified(Callback call, void* privdata) {
call(1, privdata);
return 1;
}
void myHandler(int status, void* privdata) {
char* str = (char*)privdata;
printf("%s = ", str);
if (strcmp (str, "john") == 0) {
printf("lennon");
}
else if (strcmp(str, "ringo") == 0) {
printf("star");
}
else if (strcmp(str, "ringo") == 0) {
printf("star");
}
else if (strcmp(str, "paul") == 0) {
printf("mccartney");
}
else if (strcmp(str, "george")) {
printf("harrison");
}
else {
printf("who?!?");
}
printf("\n");
}
int main()
{
char c[20];
strcpy(c, "john");
__redisAsyncCommandSimplified(myHandler, c);
strcpy(c, "paul");
__redisAsyncCommandSimplified(myHandler, c);
strcpy(c, "someone else");
__redisAsyncCommandSimplified(myHandler, c);
return 0;
}