为什么我的字符串没有正确传递给这个线程调用的函数?

时间:2013-04-04 23:16:18

标签: arrays string multithreading pthreads cstring

我正在研究一个多线程应用程序,其中客户端程序生成请求线程,该线程将字符串发送到数据服务器程序,该程序通过发回字符串来回答。不幸的是,我无法将数据从客户端的main函数传递给每个请求线程调用的函数。在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;

现在,在主要的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 *)数据) - &gt; str)),但这似乎不起作用。我的角色阵列发生了什么?

1 个答案:

答案 0 :(得分:2)

你在pthread_create中传递的&amp; dat是指向thread_args结构的指针的地址,而不是thread_args结构的地址。

没有&amp;传递数据到pthread_create,然后你的deposit_requests代码运行正常。

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