Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > потоки + ожидание завершения


Автор: chaos 28.11.2006, 08:09
Здрасте!!!
Встала задача запускать много потоков(не больше N) если кол-во запущеных потоков = N необходимо прекратить запуск потоков и перейти в ожидание завершения какого-нибудь из уже запущеных.
нашел только pthread_join но она как бы не совсем подходит. необходим некий аналог виндовой WaitForMultipleObjects
ни чего подобного не нашел smile


Подскажите знатоки как обычно в *nix'ах решают подобные задачи


Заранее благодарен!

Автор: dumb 28.11.2006, 08:26
http://www.opennet.ru/base/dev/linux_semaphore.txt.html
http://users.actcom.co.il/~choo/lupg/tutorials/multi-thread/multi-thread.html

Автор: chaos 28.11.2006, 08:42
на улице -26 в офисе дубак. smile
может у кого есть простенький пример smile 

PS 
dumb, я обязательно гляну ссылки. хочется просто быстрее smile. Но все равно Спасибо!

Автор: GrayCardinal 28.11.2006, 10:35
Типа потоков или процессы тоже покатят ?
может помочь waitpid(2). 
Первый аргумент - PID процесса который ждем, второй - адрес на статус (который вернется), третий опции (к примеру - WNOHANG не блокировать если нет "умерших" процессов).
В принципе должно и с потоками сработать..........

Добавлено @ 10:37 
<Ы>
Цитата

int status;
waitpid (-1, &status, 0);

Ждать кого-нибудь.

Автор: dumb 28.11.2006, 12:14
Цитата(chaos @  28.11.2006,  08:42 Найти цитируемый пост)
может у кого есть простенький пример

http://htun.runslinux.net/dist/htun-0.9.0/src/tpool.c

Автор: MAKCim 28.11.2006, 18:18
chaos
почему бы сигнальную переменную не использовать
Код

static struct {
    int N;
    pthread_mutex_t  mutex;
    pthread_cond_t    cond;
} thread_data;
...
static void cond_signal(void* data) {
    pthread_mutex_lock(&thread_data.mutex);
    --thread_data.N;
    pthread_cond_signal(&thread_data.cond);
    pthread_mutex_unlock(&thread_data.mutex);
}

static void* thread(void* data) {
/* в потоке */
...
    pthread_cleanup_push(&cond_signal, NULL);
...
    pthread_cleanup_pop(1);
}
...
pthread_mutex_lock(&thread_data.mutex);
if (count == thread_data.N)
    pthread_cond_wait(&thread_data.cond, &thread_data.mutex);
else {
/* запускаем поток */ 
    ++thread_data.N;
}
pthread_mutex_unlock(&thread_data.mutex);
...

Автор: chaos 1.12.2006, 12:28
dumb, спасибо за ссылочки - познавательно smile!
MAKCim, в итоге как раз так и сделал

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)