Подтвердить что ты не робот

Когда я убиваю pThread в С++, вызываются ли деструкторы объектов в стеках?

Я пишу многопоточную программу на С++. Я планирую убивать потоки. Тем не менее, я также использую ref-counted GC. Мне интересно, если объекты, связанные с стекем, будут уничтожены, когда поток будет убит.

4b9b3361

Ответ 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