У меня есть блок кода, где я внутри pthread (позволяет назвать этот поток a
), и я хочу создать новый pthread (позволяет назвать этот поток b
). Тема b
должна быть принят Deque и у меня есть следующий код:Передача deque на новый pthread
void* process_thread_b(void* arg)
{
deque<string> *ptr = (deque<string>*)arg;
cout << "Size -" << ptr->size() << endl;
deque<string>::iterator it;
for(it = ptr->begin(); it != ptr->end(); it++)
{
cout <<(*it) << endl;
}
}
Приведенные выше код является нитью b's
кода. Он передается deque, и он правильно печатает размер. В тот момент я пытаюсь распечатывания любого из его элементов, я получаю:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Abort (core dumped)
Когда я порождая PTHREAD, я использую следующий код ...
deque<string> myDeque;
// Add strings to deque here...
pthread_t dispatchCommands;
pthread_create(&dispatchCommands, NULL, &process_thread_b, (void*)&myDeque);
Дно код происходит в потоке a
. Почему, когда я пытаюсь распечатать элемент deque, я получаю сообщение об ошибке, но я могу получить его размер?
Или убедитесь, что мастер не выходит из текущей области (или дека находится в области, которая не выходит до завершения потока). (как более распространенное решение). –
Хорошая идиома, которую нужно использовать, когда вам нужно передать объект в поток, который будет «владеть», он должен выделить его с помощью 'new', передать указатель на него в функцию запуска потока и иметь поток' delete' it когда все будет сделано. Вы можете заставить функцию запуска потока выполнять всю работу, например: 'void * MyThreadFunction (void * foo) {reinterpret_cast (foo); foo-> RealWorkFunction(); удалить foo; return NULL; } ' –
Спасибо! Это исправлено! – user1314238