Привет всем. Вот возник вопрос -- как организовать пул потоков в линукс/бсд.
Пошарился по инету. Нашёл про QNX. http://www.hostmake.ru/articles/c/c3.php
очень интересная статья, ИМХО. Только вот то что мне нужно в QNX делаеться одним-двумя вызовами библиотечных функций.Так вот. Имеет ли кто подобный опыт? Мне бы примерчик простенький... любые ссылки на статьи приветствуются.
Или может есть библиотека подобная той, которая реализует вызов в QNX?
Буду благодарен за любую помощь. Спасибо.
>Привет всем. Вот возник вопрос -- как организовать пул потоков в линукс/бсд.
>
>Пошарился по инету. Нашёл про QNX. http://www.hostmake.ru/articles/c/c3.php
>очень интересная статья, ИМХО. Только вот то что мне нужно в QNX
>делаеться одним-двумя вызовами библиотечных функций.
>
>Так вот. Имеет ли кто подобный опыт? Мне бы примерчик простенький... любые
>ссылки на статьи приветствуются.
>
>Или может есть библиотека подобная той, которая реализует вызов в QNX?
>
>Буду благодарен за любую помощь. Спасибо.Сам понял, что спросил?
>Сам понял, что спросил?Прочитал ещё раз). Вроде всё правильно, только надо добавить "на языке си".
Что именно непонятно?
Может я чего-то недопонимаю?
Нужно, чтобы в приложении при вызове функции myfunct() запускался(брался) поток из пула, в котором(потоке) выполнялась бы эта функция. Если в пуле потоков недостаточно, поток должен создаваться и помещаться в пул. Контроль максимального числа потоков (в смысле чтобы количество потоков не превышало n) не обязателен, хотя желателен.
если не надо в 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.
реентерабельный код можно (и нужно) помещать после pthread_mutex_unlock
функции myfunc_thread.
Ок. Спасибо. Пример понятен. Как раз то, что нужно.
Нет ли линков на тему, почитать, просветиться?