URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4431
[ Назад ]

Исходное сообщение
"Как организовать пул потоков?"

Отправлено Andrey , 03-Июл-05 13:58 
Привет всем. Вот возник вопрос -- как организовать пул потоков в линукс/бсд.
Пошарился по инету. Нашёл про QNX. http://www.hostmake.ru/articles/c/c3.php
очень интересная статья, ИМХО. Только вот то что мне нужно в QNX делаеться одним-двумя вызовами библиотечных функций.

Так вот. Имеет ли кто подобный опыт? Мне бы примерчик простенький... любые ссылки на статьи приветствуются.

Или может есть библиотека подобная той, которая реализует вызов в QNX?

Буду благодарен за любую помощь. Спасибо.


Содержание

Сообщения в этом обсуждении
"Как организовать пул потоков?"
Отправлено Lazarenko , 03-Июл-05 16:47 
>Привет всем. Вот возник вопрос -- как организовать пул потоков в линукс/бсд.
>
>Пошарился по инету. Нашёл про QNX. http://www.hostmake.ru/articles/c/c3.php
>очень интересная статья, ИМХО. Только вот то что мне нужно в QNX
>делаеться одним-двумя вызовами библиотечных функций.
>
>Так вот. Имеет ли кто подобный опыт? Мне бы примерчик простенький... любые
>ссылки на статьи приветствуются.
>
>Или может есть библиотека подобная той, которая реализует вызов в QNX?
>
>Буду благодарен за любую помощь. Спасибо.

Сам понял, что спросил?


"Как организовать пул потоков?"
Отправлено Andrey , 03-Июл-05 16:53 
>Сам понял, что спросил?

Прочитал ещё раз). Вроде всё правильно, только надо добавить "на языке си".
Что именно непонятно?
Может я чего-то недопонимаю?
Нужно, чтобы в приложении при вызове функции myfunct() запускался(брался) поток из пула, в котором(потоке) выполнялась бы эта функция. Если в пуле потоков недостаточно, поток должен создаваться и помещаться в пул. Контроль максимального числа потоков (в смысле чтобы количество потоков не превышало n) не обязателен, хотя желателен.


"Как организовать пул потоков?"
Отправлено Maxim Kuznetsov , 04-Июл-05 14:15 
если не надо в myfunc() передавать агрументы, то элементарно просто :

/* pool protection and signals */
pthread_mutex_t pool_mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t pool_cond=PTHREAD_COND_INITIALIZER;
void *myfunc_thread(void *) {
  while(1) {
    pthread_mutex_lock(&pool_mutex);
    pthread_cond_wait(&pool_cond,&pool_mutex);
    // code placed here
    //
    pthread_mutex_unlock(&pool_mutex);
  }
}
/* create pool */
for(int i=0;i<POOL_SIZE;i++) {
  pthread_t tid;
  if (pthread_create(&tid,NULL,myfunc_thread,NULL)<0)
     exit(1);
}
//////
/* sample - call function from pool */
pthread_signal(&pool_cond);

p.s.: если надо передавать аругменты - то чуть сложнее и будет не быстрее чем просто pthread_create.


"Как организовать пул потоков?"
Отправлено Maxim Kuznetsov , 04-Июл-05 14:18 
реентерабельный код можно (и нужно) помещать после pthread_mutex_unlock
функции myfunc_thread.


"Как организовать пул потоков?"
Отправлено Andrey , 06-Июл-05 09:49 
Ок. Спасибо. Пример понятен. Как раз то, что нужно.
Нет ли линков на тему, почитать, просветиться?