0

私は、クライアント プログラムが文字列をデータ サーバー プログラムに送信する要求スレッドを生成し、データ サーバー プログラムが文字列を返信するマルチスレッド アプリケーションに取り組んでいます。残念ながら、クライアントのメイン関数から各要求スレッドによって呼び出される関数にデータを渡すのに問題があります。主に、リクエスト スレッドは次のようになります (以前の変数宣言の一部は示されていません)。

for(int j = 0; j < persons.size(); j++){  //requests deal with imaginary people 
 thread_args* dat = new thread_args; 
 strcpy(dat->str, persons[j].c_str());

 cout << "***I COPIED " << dat->str << " INTO dat->str!!!"<<endl;  //prints as expected 

 pthread_create(&request_thread[j],NULL,&deposit_requests, &dat); 
}

具体的には、スレッドで物を渡すために使用している構造は次のようになります。

typedef struct str_thdata{ 
   char str[100];
} thread_args;

さて、main 内の cout ("***I COPIED...") では、すべてがうまくいっています。正しい値が実際にコピーされます。ただし、スレッドによって呼び出される実際の関数に到達すると、文字列が失われます。

    void* deposit_requests(void* str_arg){

      for(int i = 0; i < req_per_person; i++){
         thread_args* data = (thread_args*)str_arg;
         cout << "data->str is " << data->str << endl;  //empty string!!!
         ...       
      } 
   }

私の唯一の考えは、おそらく何かが範囲外になっているということですか? ここで目が見えない限り、それがどこで起こるかわかりません。それとも、どこかで追加のキャストが必要ですか?2 番目の cout 内で (((thread_args*)data)->str) を使用していくつかのバリエーションを試しましたが、うまくいかないようでした。文字配列に何が起こっていますか?

4

1 に答える 1

2

pthread_create で渡す &dat は、thread_args 構造体のアドレスではなく、thread_args 構造体へのポインターのアドレスです。

& なしで dat を pthread_create に渡すと、deposit_requests のコードが正常に動作するはずです。

pthread_create(&request_thread[j],NULL,&deposit_requests, dat);
于 2013-04-04T23:44:02.100 に答える