2010-11-20 17 views
0

それぞれの要求に対してスレッドを開始するサーバーを作成しています。 私はリクエストのarugmentsといくつかの他のものをスレッドに渡したいと思います。 これを行うには、構造体を使用します。構造体は、割り当てられ、割り当てられた文字列を指すポインタを含みます。メインスレッドが次のループに入るときでも、スレッドの構造体を生かしておくために、そうします。 この構造体へのポインタをスレッドに渡すと、文字列を指す構造体のポインタがその情報を "失ってしまいました"。 私はEXC_BAD_ACCESSを手に入れました。なぜ私はアイデアを持っていません。割り当てられた文字列が割り当てられた文字列がpthreadの引数として渡されると、ポインタが割り当てられたときにポインタが失われる

すべてのヘルプは大歓迎:-)

typedef struct _thdata 
{ 
    int socket; 
    int thread_no; 
    char *parameter; 
}thdata; 

void *thread_function(thdata *data) 
{ 
    printf("Thread %i: got:%s\n", 
      data->thread_no, data->parameter);<-EXC_BAD_ACCESS 
    ... 
    free data->parameter; 
    free data; 
    pthread_exit((void *)0); 
} 

int main(...) 
{ ... 
    while(1){ 
    ... 
     thdata *data; 
     data = (thdata*)malloc(sizeof(data)); 
     data->socket=connSocket; 
     data->thread_no=i; 
     data->parameter=(char*)malloc(strlen(param)+1); 
     strcpy(data->parameter, param); 
    ... 
     pthread_create(&p_thread, NULL, (void *(*)(void *))thread_function, 
        (void*) &data); 
    ... 
    } 
} 

答えて

4

であるあなたは、ポインタのアドレスを渡すpthread_createに、ポインタへポインタ、すなわち、しかし、何を渡したいことはありますあなたの_thdataオブジェクトのアドレス。また、ここでvoid*にキャストする必要はありません

pthread_create(&p_thread, NULL, thread_function, data); 

:あなたは次のように、オブジェクト自体へのポインタを渡す必要があります。

+0

ああ、私はあまりにも多くの時間を見ていたので、私はもうそれを見ていない! – Schaltfehler

+0

私はstrcpyを行うために自分のコードを変更することに非常に重点を置いていましたが、私の問題があなたとまったく同じで、間違った引数を渡したことに気付かなかった。 +1されました – RyanfaeScotland

関連する問題