2013-04-04 2 views
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; 

Теперь, в 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!!! 
     ...  
     } 
    } 

Моя единственная идея заключается в том, что, возможно, что-то выходит за рамки? Если я не буду слеп здесь, я не вижу, где это произойдет. Или, может быть, мне нужно дополнительное кастинг? Я попробовал несколько вариантов во втором cout (например, используя ((thread_args *) data) -> str)), но это, похоже, не сработало. Что происходит с моим массивом символов?

ответ

2

Это &, которое вы передаете в pthread_create, является адресом указателя на структуру thread_args, а не адресом структуры thread_args.

Передача данных без & на pthread_create, а затем ваш код для deposit_requests должен работать нормально.

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

Кто-то еще указал, но затем их сообщение исчезло, это локальная переменная в кадре стека другого потока. Когда вы передаете его с помощью &, вы передаете указатель на сущность, которая исчезнет, ​​как только закончится функция, называемая pthread_create. Однако, передавая, что есть, вы передаете указатель на выделенную кучу сущность, которая продолжается до тех пор, пока вы ее не освободите. –

+0

«кто-то еще», возможно, понял, что возможно, что функция, вызывающая pthread_create, никогда не заканчивается, и в этом случае объект не исчезнет. Забота действительна в общем случае, но не является блокировкой. –