Я работаю над многопоточным приложением, в котором клиентская программа генерирует потоки запросов, которые отправляют строки в программу сервера данных, которая отвечает, отправляя строки назад. К сожалению, мне не удается передать данные из основной функции клиента функции, которая вызывается каждым потоком запроса. В основном, я получаю запрос нити происходит, как это (некоторые предыдущие декларации переменных не показаны):Почему моя строка не передается должным образом этой функции, вызванной потоком?
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)), но это, похоже, не сработало. Что происходит с моим массивом символов?
Кто-то еще указал, но затем их сообщение исчезло, это локальная переменная в кадре стека другого потока. Когда вы передаете его с помощью &, вы передаете указатель на сущность, которая исчезнет, как только закончится функция, называемая pthread_create. Однако, передавая, что есть, вы передаете указатель на выделенную кучу сущность, которая продолжается до тех пор, пока вы ее не освободите. –
«кто-то еще», возможно, понял, что возможно, что функция, вызывающая pthread_create, никогда не заканчивается, и в этом случае объект не исчезнет. Забота действительна в общем случае, но не является блокировкой. –