1

私の課題は、プリント サーバーの簡素化されたマルチスレッド モックアップを作成することです。

関数 get_server のプロトタイプは次のとおりです。

void *get_request(void *arg);

「パラメータargは、リクエストが読み取られるオープンファイル記述子を指しています。」したがって、テストでは STDIN_FILENO を使用することをお勧めします。

pthread_create(&tid, &attr, get_request, STDIN_FILENO);

関数内で arg を使用しようとしていますが、それを void * から使用可能なものに変更することはできません。たとえば、これはどれも機能しません:

read(*arg, intvariable, sizeof(int)); // can't cast void * error
int fd = *arg; // can't cast void * error
int fd = *(int *)arg; // seg fault
int fd = *((int *)arg); // seg fault

int fd = atoi(arg); // seg fault
// yes I'm aware arg isn't a char* but that's 
// from the example code we were given
4

2 に答える 2

4

あなたは正しい道を進んでいます:

void *get_request(void *arg)
{
    int fd = (int) arg;

    ...
}

ただし、推奨される方法ではありません。代わりに、変数を作成し、そのアドレスをpthread_create呼び出しに渡します。

int fd = STDIN_FILENO;
pthread_create(&tid, &attr, get_request, &fd);

次に、使用します

void *get_request(void *arg)
{
    int fd = *((int *) arg);

    ...
}

ただし、呼び出しに使用される変数のスコープがpthread_createスレッドの開始前に不足しないように注意してください。次に、未使用のメモリへのポインタがあります。この変数を関数の先頭に置きmainます ( を呼び出しpthread_createている場合main)。

于 2012-11-22T03:10:00.230 に答える
0

関数は値へのポインタを期待していますが、自体を渡しています!したがって、ポインタスキームに従うには、値を含むグローバル変数へのポインタを渡す必要がありますSTDIN_FILENO

または、現在行っているようにパスして「チート」し、を単純なもの(ポインターではありません!)にSTDIN_FILENOキャストして、そのまま使用することもできます。void*int

int fd = (int) arg;
于 2012-11-22T03:11:20.160 に答える