0

我正在开发一个多线程应用程序,其中客户端程序生成将字符串发送到数据服务器程序的请求线程,数据服务器程序通过发送回字符串来回答。不幸的是,我无法将数据从客户端的主函数传递到每个请求线程调用的函数。在 main 中,我得到了这样的请求线程(一些以前的变量声明未显示):

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 ("***I COPIED...") 中的 cout 中,一切都很好。确实复制了正确的值。但是,当我到达线程调用的实际函数时,字符串丢失了:

    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!!!
         ...       
      } 
   }

我唯一的想法是,也许有些事情超出了范围?除非我在这里失明,否则我看不到它会发生在哪里。或者也许我需要在某个地方进行额外的演员表?我在第二个 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 回答