Добрый вечер!
Не могу найти функции, которые бы не блокировали вызывающий поток на время выполнения дочернего.
Попробовал pthread_join(...), но он блокирует.
Какие у меня варианты? Совсем теряюсь.
Спасибо!
Неблокирующее ожидание потока. (Какие функции стоит использовать?)
Модератор: Модераторы разделов
-
Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Неблокирующее ожидание потока.
Какой-то очень странный вопрос. Я нифига не понял. Опиши подробнее, что ты пытаешься сделать?
-
wank
- Сообщения: 5
- ОС: Slackware 12 (2.6)
Re: Неблокирующее ожидание потока.
Есть основной "программный поток", он вызывает много-много дочерних потоков. В частности в моей программе они будут выполнять соединения через сокеты. Основной поток ими управляет, следит, чтобы в один момент выполнялось не более чем заданное количество потоков(тут сделано для экономии ширины канала).
Собственно мне нужно запустить потоки так, чтобы основная программа продолжала бы работу в обычном режиме, но не завершилась бы раньше, чем последний из порожденных потоков.
*Какую-нибудь функцию, которая оповещает программу, что поток завершил свое действие, но в это время не блокирующую саму программу на время работы потока. Не знаю как еще пояснить...
Собственно мне нужно запустить потоки так, чтобы основная программа продолжала бы работу в обычном режиме, но не завершилась бы раньше, чем последний из порожденных потоков.
*Какую-нибудь функцию, которая оповещает программу, что поток завершил свое действие, но в это время не блокирующую саму программу на время работы потока. Не знаю как еще пояснить...
-
Voice
- Сообщения: 1073
- Статус: столлманист
- ОС: Debian GNU/Linux
Re: Неблокирующее ожидание потока.
Вот листаю книжонку "Программирование для Linux. Професиональный подход", так тут говорят только про функцию
pthread_join(). Но она блокирует вызывающий ее поток, а значит вам не подойдет
Попробуйте организовать то что вы хотите с семафором. Думаю получится.
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
М. В. Ломоносов
-
Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Неблокирующее ожидание потока.
Весь смысл функции 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: Неблокирующее ожидание потока.
wank писал(а): ↑31.07.2007 18:12Есть основной "программный поток", он вызывает много-много дочерних потоков. В частности в моей программе они будут выполнять соединения через сокеты. Основной поток ими управляет, следит, чтобы в один момент выполнялось не более чем заданное количество потоков(тут сделано для экономии ширины канала).
Собственно мне нужно запустить потоки так, чтобы основная программа продолжала бы работу в обычном режиме, но не завершилась бы раньше, чем последний из порожденных потоков.
*Какую-нибудь функцию, которая оповещает программу, что поток завершил свое действие, но в это время не блокирующую саму программу на время работы потока. Не знаю как еще пояснить...
Да причем тут вообще функции ожидания потока. Потоки создаешь ты сам, для каждого клиента, соответственно можешь вести счетчик их кол-ва. Зная кол-во работающих потоков, ты можешь решить завершать основной поток или нет. Если требуется блокирующее ожидание, то надо семафоры юзать.
-
Voice
- Сообщения: 1073
- Статус: столлманист
- ОС: Debian GNU/Linux
Re: Неблокирующее ожидание потока.
Скорее наоборот. Можна проверить семафор не блокируясь.
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
М. В. Ломоносов
-
d_n_k
- Сообщения: 636
- ОС: Gentoo GNU/Linux
Re: Неблокирующее ожидание потока.
pthread_tryjoin_np
pthread_timedjoin_np
просто открываешь pthread.h и смотришь что там есть
pthread_timedjoin_np
просто открываешь pthread.h и смотришь что там есть
все сказанное есть имхо...
-
a_borovsky
- Сообщения: 146
- ОС: много
Re: Неблокирующее ожидание потока.
wank писал(а): ↑31.07.2007 18:12Есть основной "программный поток", он вызывает много-много дочерних потоков. В частности в моей программе они будут выполнять соединения через сокеты. Основной поток ими управляет, следит, чтобы в один момент выполнялось не более чем заданное количество потоков(тут сделано для экономии ширины канала).
Собственно мне нужно запустить потоки так, чтобы основная программа продолжала бы работу в обычном режиме, но не завершилась бы раньше, чем последний из порожденных потоков.
*Какую-нибудь функцию, которая оповещает программу, что поток завершил свое действие, но в это время не блокирующую саму программу на время работы потока. Не знаю как еще пояснить...
Сделать счетчик количества запущенных потоков, и следить, чтобы значение не превышало. А когда станет 0, значит все потоки закончили.