Неблокирующее ожидание потока. (Какие функции стоит использовать?)

Модератор: Модераторы разделов

wank
Сообщения: 5
ОС: Slackware 12 (2.6)

Неблокирующее ожидание потока.

Сообщение wank »

Добрый вечер!

Не могу найти функции, которые бы не блокировали вызывающий поток на время выполнения дочернего.
Попробовал pthread_join(...), но он блокирует.

Какие у меня варианты? Совсем теряюсь.

Спасибо!
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Неблокирующее ожидание потока.

Сообщение Uncle_Theodore »

wank писал(а):
31.07.2007 17:54
Добрый вечер!

Не могу найти функции, которые бы не блокировали вызывающий поток на время выполнения дочернего.
Попробовал pthread_join(...), но он блокирует.

Какие у меня варианты? Совсем теряюсь.

Спасибо!

Какой-то очень странный вопрос. Я нифига не понял. Опиши подробнее, что ты пытаешься сделать?
Спасибо сказали:
wank
Сообщения: 5
ОС: Slackware 12 (2.6)

Re: Неблокирующее ожидание потока.

Сообщение wank »

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

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

*Какую-нибудь функцию, которая оповещает программу, что поток завершил свое действие, но в это время не блокирующую саму программу на время работы потока. Не знаю как еще пояснить...
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Неблокирующее ожидание потока.

Сообщение Voice »

wank писал(а):
31.07.2007 18:12
*Какую-нибудь функцию, которая оповещает программу, что поток завершил свое действие, но в это время не блокирующую саму программу на время работы потока. Не знаю как еще пояснить...


Вот листаю книжонку "Программирование для Linux. Професиональный подход", так тут говорят только про функцию
pthread_join(). Но она блокирует вызывающий ее поток, а значит вам не подойдет :(
Попробуйте организовать то что вы хотите с семафором. Думаю получится.
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Неблокирующее ожидание потока.

Сообщение Uncle_Theodore »

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

Код:

#include <stdio.h> #include <stdlib.h> #include <pthread.h> int thread1_is_alive, thread2_is_alive; void *print_message_function( void *ptr ) { int i; int *number; number = (int *) ptr; for(i=0;i<5;i++) { printf("I'm thread %d working\n", *number); sleep(1); }; if (*number == 1) thread1_is_alive = 0; else thread2_is_alive = 0; } int main() { pthread_t thread1, thread2; int number1 = 1; int number2 = 2; int iret1, iret2; iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) &number1); iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) &number2); thread1_is_alive = 1; thread2_is_alive = 1; while(thread1_is_alive || thread2_is_alive) { printf("I'm the mother, waiting for threads to die\n"); sleep(1); }; pthread_join( thread1, NULL); pthread_join( thread2, NULL); printf("Thread 1 returns: %d\n",iret1); printf("Thread 2 returns: %d\n",iret2); return 0; }
Спасибо сказали:
s0L
Сообщения: 50
ОС: Gentoo 2007.0

Re: Неблокирующее ожидание потока.

Сообщение s0L »

wank писал(а):
31.07.2007 18:12
Есть основной "программный поток", он вызывает много-много дочерних потоков. В частности в моей программе они будут выполнять соединения через сокеты. Основной поток ими управляет, следит, чтобы в один момент выполнялось не более чем заданное количество потоков(тут сделано для экономии ширины канала).

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

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


Да причем тут вообще функции ожидания потока. Потоки создаешь ты сам, для каждого клиента, соответственно можешь вести счетчик их кол-ва. Зная кол-во работающих потоков, ты можешь решить завершать основной поток или нет. Если требуется блокирующее ожидание, то надо семафоры юзать.
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Неблокирующее ожидание потока.

Сообщение Voice »

s0L писал(а):
01.08.2007 09:23
Если требуется блокирующее ожидание, то надо семафоры юзать.

Скорее наоборот. Можна проверить семафор не блокируясь.
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: Неблокирующее ожидание потока.

Сообщение d_n_k »

pthread_tryjoin_np
pthread_timedjoin_np


просто открываешь pthread.h и смотришь что там есть
все сказанное есть имхо...
Спасибо сказали:
a_borovsky
Сообщения: 146
ОС: много

Re: Неблокирующее ожидание потока.

Сообщение a_borovsky »

wank писал(а):
31.07.2007 18:12
Есть основной "программный поток", он вызывает много-много дочерних потоков. В частности в моей программе они будут выполнять соединения через сокеты. Основной поток ими управляет, следит, чтобы в один момент выполнялось не более чем заданное количество потоков(тут сделано для экономии ширины канала).

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

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


Сделать счетчик количества запущенных потоков, и следить, чтобы значение не превышало. А когда станет 0, значит все потоки закончили.
Спасибо сказали: