1

redisAsyncCommand( ) のソースで提供される関数定義は次のとおりです。

static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *cmd, size_t len) { ... }

void *privdata議論の目的は何ですか?どのような場合に役立ちますか?

4

1 に答える 1

3

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;
}
于 2015-06-12T10:54:53.870 に答える