стирание переменной, содержащей поток pthread, во время работы

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


person Zach    schedule 05.04.2011    source источник


Ответы (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);
person UmmaGumma    schedule 05.04.2011
comment
Я держу карту ‹int, pthread_t›. Я просто хочу убедиться, что вы говорите: если я сотру объект pthread_t во время работы pthread, ничего плохого не произойдет? - person Zach; 05.04.2011
comment
@Andrew, когда вы вызываете pthread_create(), операционная система возвращает вам идентификатор вашего потока (уникальный идентификатор) в аргументе pthread_t, который идентифицирует ваш поток, не более того. Так что стирание не принесет никакого вреда. - person UmmaGumma; 05.04.2011
comment
@Andrew см. Edit2 для синхронизации. - person UmmaGumma; 05.04.2011

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

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

person Ciaran McHale    schedule 05.04.2011
comment
вопрос говорит об удалении потока pthread с карты в команде last функции pthread. Это означает, что после стирания элемента из карты поток заканчивается. Поэтому нет необходимости вызывать pthread_join после стирания элемента. - person UmmaGumma; 05.04.2011
comment
@Ashot, похоже, вы думаете, что pthread_join() просто ждет завершения потока. Это неверно. pthread_join() ожидает завершения потока (если поток еще этого не сделал) , а затем освобождает некоторые ресурсы, связанные с этим потоком, который сейчас завершен. Из-за этого приложение должно вызывать pthread_join() для присоединяемого потока; в противном случае произойдет утечка памяти. Удаление идентификатора потока из std::map не заменяет вызов pthread_join(). - person Ciaran McHale; 07.04.2011

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

person johnnycrash    schedule 06.04.2011

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

person Begemoth    schedule 05.04.2011