2012-04-30 8 views
2

У меня есть блок кода, где я внутри 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, я получаю сообщение об ошибке, но я могу получить его размер?

ответ

5

pthread_create вернется задолго до того, как ваша функция потока начнет выполняться. Ваш deque будет уничтожен давно. Вам нужно создать его в куче.

+1

Или убедитесь, что мастер не выходит из текущей области (или дека находится в области, которая не выходит до завершения потока). (как более распространенное решение). –

+0

Хорошая идиома, которую нужно использовать, когда вам нужно передать объект в поток, который будет «владеть», он должен выделить его с помощью 'new', передать указатель на него в функцию запуска потока и иметь поток' delete' it когда все будет сделано. Вы можете заставить функцию запуска потока выполнять всю работу, например: 'void * MyThreadFunction (void * foo) {reinterpret_cast (foo); foo-> RealWorkFunction(); удалить foo; return NULL; } ' –

+0

Спасибо! Это исправлено! – user1314238

1

Я думаю, это потому, что вы пытаетесь бросить ссылку на палубу к ничтожной *, попробуйте следующее:

deque<string> * myDeque = new deque<string>(); 

затем использовать -> для доступа к его функциям.

Затем вы можете наложить myDeque прямо на указатель пустоты, и он останется инициализированным.

ie. :

(void*)myDeque 

Надеюсь, это поможет.