стирание переменной, удерживающей pthread во время работы - PullRequest
0 голосов
/ 05 апреля 2011

В моей программе есть карта для хранения pthread-файлов, созданных методом pthread_create (для которых требуется поместить этот pthread), связанных с соответствующим идентификатором потока.
Есть ли проблема удаления pthread изmap в последней команде функции pthread?

Ответы [ 4 ]

4 голосов
/ 05 апреля 2011

Как вы сказали, у вас есть идентификатор потока.Это просто число.Ничего более.

Стирающий элемент (число) не может причинить вред вашей программе.

Редактировать: Однако вы должны проверить, что стирание элемента в std::map выполняется синхронизировано.Не забывайте, что контейнеры STL могут быть не поточнобезопасными.См. этот вопрос для получения дополнительной информации.

Edit2: Чтобы убедиться, что у вас нет проблем с синхронизацией, сделайте следующее:

pthread_mutex_t mut;         //global variable
pthread_mutex_init(&mut,0);  //initialize mutex before calling pthread_create()



//and use mutex to prevent synchronization problems in the end of .
pthread_mutex_lock(&mut);
my_map.erase(key);
pthread_mutex_unlock(&mut);
1 голос
/ 05 апреля 2011

Я согласен с ответом Ашота Мартиросяна.Я просто хочу добавить еще одну точку.

Если потоки создаются как присоединяемые, то вашему приложению потребуется вызвать pthread_join();в противном случае вы потеряете память.Если карта является единственным местом, где вы записываете идентификаторы потоков, вы не сможете присоединиться к потокам, если каждый поток удалил свой идентификатор потока из карты непосредственно перед тем, как он умер.

0 голосов
/ 07 апреля 2011

Вы можете стереть данные, когда захотите.Однако в вашей программе могут быть условия гонки, если потоки обращаются к этой карте.если поток A завершает свою работу, но его удаляют, прежде чем он удалит свои данные, поток B может увидеть данные потока A и подумать, что поток A все еще является жизнеспособным потоком.

0 голосов
/ 05 апреля 2011

Вам следует либо pthread_join, либо pthread_detach, либо создать обнаруженную ветку, в противном случае вы когда-нибудь получите ошибку от pthread_create.Для всех присоединяемых потоков ОС резервирует некоторое количество памяти для хранения возвращаемого значения потока.Общий объем памяти, зарезервированный для этой цели, ограничен и может быть меньше ожидаемого, поэтому отсоедините все потоки, к которым вы не собираетесь присоединяться.

...