2014-01-27 2 views
0

В Linux, используя C, я пытаюсь запустить несколько потоков (pthreads), и я хочу, чтобы они были убиты, если они не заканчиваются через X секунд. Как я могу предложить это сделать? Моя первая мысль - использовать таймеры POSIX и список, чтобы установить таймер на следующий и убить соответствующий поток. Он должен работать, но должен быть более простой способ реализовать это. Есть идеи? :)Как я могу пропустить поток в linux?

+1

опубликовать код, который вы пробовали ... – sujin

ответ

2

Здесь простой пример взят из http://www.cs.cf.ac.uk/Dave/C/node31.html

#include <pthread.h> 
#include <time.h> 

pthread_timestruc_t to; 
pthread_cond_t cv; 
pthread_mutex_t m; 
timestruct_t abstime; 
int ret; 

/* wait on condition variable */ 

ret = pthread_cond_timedwait(&cv, &m, &abstime); 

pthread_mutex_lock(&m); 
/* initialize time variable */ 
to.tv_sec = time(NULL) + TIMEOUT; 
to.tv_nsec = 0; 

while (cond == FALSE) 
{ err = pthread_cond_timedwait(&c, &m, &to); 
    if (err == ETIMEDOUT) 
     { /* timeout, do something */ 
     break; 
    } 
} 
pthread_mutex_unlock(&m); 

Вы можете установить тайм-аут, определяющий TIMEOUT макрос в секундах.

+0

Не блокирует ли вызывающий поток? Полагаю, я мог бы создать 2 потока для каждого «потока». – user1032861

+0

Блокировка (un) является только образцом. Основной функцией является 'pthread_cond_timedwait()'. Это идея о том, как создать условие таймаута. – jcfaracco

2

Во-первых, выложите из головы, что есть «простой» способ убивать потоки. Любой достаточно полезный поток будет содержать ресурсы - дескрипторы файлов, буферы, указатели на кучу выделенной памяти, блокировки, condvars и т. Д. Просто отправка сигнала «bang you're dead» редко подходит для чего угодно, кроме самого тривиальная программа.

Это говорит о двух основных вещах, которые вы должны рассмотреть: метод отключения потока и таймеры.

В терминах отключения есть несколько возможностей: (1) отправка сигнала для уничтожения нити (как правило, плохой); (2) предупреждение о том, что нить закрывается с помощью какого-либо метода (например, чтение канала, установка переключателя в контуре событий потоков, нефатальный сигнал и т. Д.) (0) pthread_cancel. в значительной степени привести вас к семейству вызовов timer_create.Если вы планируете синхронизировать и отменяете несколько потоков, вам нужно несколько таймеров, а alarm и itimer не собираются его обрезать. timer_create позволяет использовать несколько вариантов. Вы можете направить излучаемый сигнал на поток (ы), который вы хотите отменить, или поток мониторинга, который затем отменяет просроченную нить. Если вы прочитаете документацию, вы можете увидеть некоторые из возможностей, которые подходят именно для вашей ситуации, только вы можете знать прямо сейчас.

+0

Я не вижу, как вариант 1 должен работать. Отправка 'SIGKILL' в определенную цепочку убьет весь процесс и все остальные его потоки. Но, возможно, я неправильно понял, что вы имели в виду. – alk

+0

@alk, я думал о сигнале, который можно было бы обработать, поскольку все они в значительной степени должны быть, или они в конечном итоге подавляют процесс. Вы видите это много, когда люди хотят выдуть нить из заблокированного сценария и поручиться на прерывание, а не использовать трюк с трубой или что-то еще. Это все, что я получал, но вы правы, что это ленивый ответ. – Duck

Смежные вопросы