Очистить ресурсы pthread при завершении программы - PullRequest
0 голосов
/ 20 октября 2010

Я создал тему, используя pthread.Моя рабочая рутина - это бесконечный цикл.Каков шаблон проектирования для завершения и очистки всех ресурсов pthread при выходе из моей основной программы?

pthread_create(&thread, NULL, worker, NULL);

void* worker(void* arg){

while(true){

 //do something
}

}

Спасибо

Ответы [ 4 ]

0 голосов
/ 20 октября 2010

Когда ваша основная программа завершает работу, все потоки также закрываются. Это означает, что только один поток вызывает функцию exit () (или если основная подпрограмма завершается), тогда другие потоки завершат работу.

Вы не можете просто убить темы. Если вы убиваете потоки, которые выполняют работу, то в лучшем случае вы получаете утечку памяти, а в худшем - тупик. В любом случае это не красиво.

Любые ресурсы, которые очищаются при завершении процесса, будут очищаться при выходе из последнего потока (или если какой-либо поток вызывает функцию exit ()). Это включает в себя память (исключая разделяемую память, например, posix или sysv), файловые объекты (если ни у какого другого процесса нет открытого дескриптора для них) и некоторые другие типы объектов.

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

0 голосов
/ 20 октября 2010

У меня обычно есть глобальная переменная, которая инициализируется как true и имеет значение false, когда вы хотите, чтобы потоки выходили и присоединялись к потокам из основной функции.Псевдокод ниже:

global isRunning = true

def main:
    isRunning = true
    id1 = startThread (worker)
    id2 = startThread (worker)
    id3 = startThread (worker)
    joinThread (id1)
    joinThread (id2)
    joinThread (id3)
    exit

def worker:
    initialiseWorker()
    while isRunning:
          # something in here (or a signal handler) will
          #  set isRunning to false.
          doSomeWork()
    terminateWorker()

И убедитесь, что потоки выполняют этот цикл своевременно, чтобы они могли определить, когда они должны выйти.Если они имеют долго выполняющихся заданий, вам также необходимо периодически проверять в пределах doSomeWork().Я установил общее правило, что потоки должны выходить в течение пяти секунд после того, как им будет сказано.

Я не никогда не убиваю потоки извнеСлишком много проблем, которые можно представить.Метод global flag позволяет каждому потоку управлять самим собой, поскольку обычно он единственный, кто знает, когда безопасно безопасно выйти.

0 голосов
/ 20 октября 2010

В дополнение к проверке переключателя, глобального или другого, pthreads имеет свой собственный механизм отмены.Посмотрите на pthread_cancel () , pthread_setcancelstate () , pthread_setcanceltype () , pthread_testcancel () , pthread_cleanup_push () и т. Д.

Основная идея заключается в том, что рабочие потоки создают (или используют существующие) точки отмены.Если отменено, обработчики принудительной очистки потока вызываются для очистки ресурсов перед выходом.

0 голосов
/ 20 октября 2010

Все нити должны выходить самостоятельно, иначе вам придется их чистить вручную.В первом методе вам нужно будет использовать некоторую глобальную переменную, которая будет защищена с помощью блокировок, чтобы сообщить потокам о прекращении выполнения.Нечто подобное будет внутри вашего цикла while (true) в каждом потоке.

while(true)  
{  
  GetLock(SomeGlobalVariable);  
  if(SomeGlobalVariable == true)  
   {  
    unlock(SomeGlobalVariable);   
    break;  
   }  
unlock(SomeGlobalVariable);   
} 

Во втором методе вам нужно будет отслеживать все ThreadIds, которые вы создали в массиве, а затем навремя выхода убить все эти идентификаторы один за другим.

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

Для этого есть библиотеки.например, http://threadpool.sourceforge.net/

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