У меня есть карта в моей программе для хранения потоков pthread, созданных методом pthread_create (для которого требуется место для размещения этого потока pthread), связанных с соответствующим идентификатором потока.
Есть ли проблема стирания потока pthread с карты в последняя команда функции pthread?
стирание переменной, содержащей поток pthread, во время работы
Ответы (4)
Как вы сказали, у вас есть идентификатор потока. Это просто число. Больше ничего.
Стирание элемента (числа) не может повредить вашей программе.
Изменить: однако вы должны проверить, что стирающий элемент в 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);
pthread_create()
, операционная система возвращает вам идентификатор вашего потока (уникальный идентификатор) в аргументе pthread_t, который идентифицирует ваш поток, не более того. Так что стирание не принесет никакого вреда.
- person UmmaGumma; 05.04.2011
Я согласен с ответом Ашота Мартиросяна. Я просто хочу добавить еще один момент.
Если потоки созданы как присоединяемые, тогда ваше приложение должно будет вызвать pthread_join()
; иначе у вас будет утечка памяти. Если карта - единственное место, где вы записываете идентификаторы потоков, вы не сможете присоединиться к потокам, если каждый поток удалил свой идентификатор потока с карты непосредственно перед тем, как он умер.
pthread_join
после стирания элемента.
- person UmmaGumma; 05.04.2011
pthread_join()
просто ждет завершения потока. Это неверно. pthread_join()
ожидает завершения потока (если поток еще этого не сделал) , а затем освобождает некоторые ресурсы, связанные с этим потоком, который сейчас завершен. Из-за этого приложение должно вызывать pthread_join()
для присоединяемого потока; в противном случае произойдет утечка памяти. Удаление идентификатора потока из std::map
не заменяет вызов pthread_join()
.
- person Ciaran McHale; 07.04.2011
Вы можете стереть данные, когда захотите. Однако в вашей программе могут быть состояния гонки, если потоки обращаются к этой карте. если поток A завершается, но его заменяют, прежде чем он стирает свои данные, поток B может видеть данные потока A и думать, что поток A все еще является жизнеспособным потоком.
Вы должны либо pthread_join
, либо pthread_detach
, либо создать обнаруженный поток, иначе вы когда-нибудь получите сообщение об ошибке от pthread_create
. Для всех присоединяемых потоков ОС резервирует некоторый объем памяти для хранения возвращаемого значения потока. Общий объем памяти, зарезервированной для этой цели, ограничен и может быть меньше ожидаемого, поэтому отсоедините все потоки, к которым вы не собираетесь присоединяться.