Я пишу многопоточную программу на С++. Я планирую убивать потоки. Тем не менее, я также использую ref-counted GC. Мне интересно, если объекты, связанные с стекем, будут уничтожены, когда поток будет убит.
Когда я убиваю pThread в С++, вызываются ли деструкторы объектов в стеках?
Ответ 1
Стек не разматывается, когда вы "убиваете" поток.
Убийственные потоки не являются надежным способом работы - ресурсы, которые они открывают, например файлы, остаются открытыми до тех пор, пока процесс не завершится. Кроме того, если они закрывают любые блокировки в момент их закрытия, блокировка, вероятно, остается заблокированной. Помните, что вы, вероятно, называете много кода платформы, который вы не контролируете, и вы не всегда можете это видеть.
Изящный надежный способ закрыть поток - это прервать его - как правило, он будет опросить, чтобы узнать, было ли сказано периодически закрываться или он запускает цикл сообщений, и вы отправляете ему сообщение о выходе.
Ответ 2
Я сомневаюсь в этом: pthread - это чистый C api, поэтому я сомневаюсь, что у него будет какой-нибудь механизм, чтобы раскрутить стопку потока.
Ответ 3
Это не стандартизировано для этого. Похоже, что некоторые реализации выполняются, а некоторые нет.
pthread_cancel() действительно следует избегать, если можно; он фактически не останавливает поток до тех пор, пока он не достигнет точки отмены, что обычно является любым другим вызовом pthread_ *. В частности, на множестве платформ отмена не прерывает чтение блокировки.
Ответ 4
#include<iostream>
#include<pthread.h>
class obj
{
public:
obj(){printf("constructor called\n");}
~obj(){printf("destructor called\n");}
};
void *runner(void *param)
{
printf("In the thread\n");
obj ob;
puts("sleep..");
sleep(4);
puts("woke up");
pthread_exit(0);
}
int main(int argc,char *argv[])
{
int i,n;
puts("testing pkill");
pthread_attr_t attr;
pthread_t tid;
//create child thread with default attributes
pthread_attr_init(&attr);
pthread_create(&tid,&attr,runner,0);
pthread_cancel(tid);
pthread_join(tid,NULL);//wait till finished
//the parent process outputs value
return 0;
}
Хотя это не совпадает с приведенными выше представлениями, следующие выходы кода
testing pkill In the thread constructor called sleep.. destructor called