Могу ли я вывести экземпляр pthread_t из области видимости? - PullRequest
4 голосов
/ 28 июля 2011

Я программирую на C и pthreads.У меня есть долгосрочная функция, которую я хочу запустить в отдельном потоке:

void long_running_function(void * arg) {  
  ...
}


void start_long_running_function(void * arg) {  
  pthread_t thread;  
  pthread_create( &thread , NULL , long_running_function , arg);
  /* What about the thread variable? */  
}  

При выходе из функции start_long_running_function () локальная переменная 'thread' выйдет из области видимости.Это нормально - или я могу рисковать, например, когда long_running_function () завершен?

Я попробовал подход, показанный в моем коде, и он, кажется, работает - но, может быть, это только удача?

С уважением, Иоаким

Ответы [ 2 ]

4 голосов
/ 28 июля 2011

Да - безопасно выпустить переменную из области видимости.Но помните, что в какой-то момент вы должны сделать одно из двух:

1) pthread_detach (), чтобы ядро ​​освободило некоторые связанные с ним вещи.

2) pthread_join () это имеет побочный эффект, отделяющий его.

Если вы этого не сделаете, я думаю, что это будет утечка ресурсов.

0 голосов
/ 28 июля 2011

Это структура C, Plain Old Data, поэтому нет деструктора, который бы вводил побочные эффекты, когда он выходит из области видимости.Единственное следствие потери области видимости - это то, что вы больше не можете ее видеть.

Я знаю, что у вас вопрос C, но многие реализации потоков решают проблему с помощью чего-то подобного:

class Thread {
    pthread_t handle;

    static void * start (void * self) {
        static_cast <Thread *> (self) -> run ();
    }

    protected: void run () = 0;

    public: void start () {
        pthread_create (&handle, NULL, start, this);
    }

    ~ Thread () {
        pthread_join (&handle, NULL);
    }
};

Вы можете сделать что-то аналогичное C, arg - это указатель на malloc ed структуру, которая содержит дескриптор потока;функция потока frees это по окончании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...