Когда я убиваю pThread в C ++, вызывается ли деструктор объектов в стеках? - PullRequest
11 голосов
/ 29 января 2010

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

Ответы [ 4 ]

15 голосов
/ 29 января 2010

Стек не раскручивается, когда вы «убиваете» поток.

Уничтожение потоков не является надежным способом работы - открытые ими ресурсы, такие как файлы, остаются открытыми до закрытия процесса. Кроме того, если они удерживают открытыми какие-либо замки в то время, когда вы их закрываете, замок, вероятно, остается заблокированным. Помните, что вы, вероятно, вызываете много кода платформы, который вы не контролируете, и вы не всегда можете видеть эти вещи.

Изящный надежный способ закрыть поток - это прервать его - обычно он запрашивает, не было ли ему приказано периодически закрываться, или он запускает цикл сообщений, и вы отправляете ему сообщение о выходе.

1 голос
/ 29 января 2010

Я сомневаюсь в этом - pthread - это чистый C api, поэтому я сомневаюсь, что у него был бы какой-либо механизм для размотки стека потока.

0 голосов
/ 29 января 2010

#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
0 голосов
/ 29 января 2010

Это не стандартизировано, чтобы сделать это. Похоже, что некоторые реализации делают, а некоторые нет.

pthread_cancel () действительно следует избегать, если вы можете; он на самом деле не останавливает поток, пока не достигнет точки отмены, которая обычно является любым другим вызовом pthread_ *. В частности, на многих платформах отмена не прерывает чтение блокировки.

...