redisAsyncCommand( ) のソースで提供される関数定義は次のとおりです。
static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *cmd, size_t len) { ... }
void *privdata
議論の目的は何ですか?どのような場合に役立ちますか?
gihub のコードを読んで理解したように、privdata の目的は、コールバックに定義済みのデータを送信することです (これは何でもかまいません。そのため、void* が使用されます)。コールバック (redisCallbackFn への fn ポインター) で、その privdata をパラメーターとして受け取ります (たとえばcb->fn(ac,reply,cb->privdata);
、 func__redisRunCallback
ファイルをasync.c
参照) 。
たとえば、(同様の簡略化された疑似コード)は次のとおりです。この例では、__redisAsyncCommandSimplified への 3 つの連続した呼び出しと、1 つのハンドラー (コールバック) のみがあります。コールバックでは、コールバックの動作を決定するために privdata を使用しました。コールバックは、その privdata データを別の目的で使用することもできます (別の関数呼び出しのパラメーター、ロギング、構造の作成/作成など)...
#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;
}