我正在研究一个多线程应用程序,其中客户端程序生成请求线程,该线程将字符串发送到数据服务器程序,该程序通过发回字符串来回答。不幸的是,我无法将数据从客户端的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)),但这似乎不起作用。我的角色阵列发生了什么?
答案 0 :(得分:2)
你在pthread_create中传递的&amp; dat是指向thread_args结构的指针的地址,而不是thread_args结构的地址。
没有&amp;传递数据到pthread_create,然后你的deposit_requests代码运行正常。
pthread_create(&request_thread[j],NULL,&deposit_requests, dat);