C: Как можно создать пул-нить с помощью pthread-ов? - PullRequest
17 голосов
/ 05 августа 2011

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

JOB QUEUE        | job1 | job2 | job3 | job4 | ..

THREAD POOL      | thread1 | thread2 | thread3 | thread4 |

Чтобы создать потоки, которые у меня есть в данный момент в точке инициализации:

for (t=0; t<num_of_threads; t++){
    pthread_create(&(threads[t]), NULL, doSth2, NULL);
}

Где num_of_threads = 4 и doSth2 - это функция, в которой ничего нетИтак, как только я создал 4 потока, и они закончили с doSth2, как я могу дать им новую работу, не убивая их?

Ответы [ 2 ]

19 голосов
/ 05 августа 2011

Ключом к пулу потоков является очередь.Вот измененные функции для созданного мной пула потоков.

Поместить элемент в очередь

void queue_add(queue q, void *value)
{
    pthread_mutex_lock(&q->mtx);

    /* Add element normally. */

    pthread_mutex_unlock(&q->mtx);

    /* Signal waiting threads. */
    pthread_cond_signal(&q->cond);
}

Получить элемент из очереди

void queue_get(queue q, void **val_r)
{
    pthread_mutex_lock(&q->mtx);

    /* Wait for element to become available. */
    while (empty(q))
        rc = pthread_cond_wait(&q->cond, &q->mtx);

    /* We have an element. Pop it normally and return it in val_r. */

    pthread_mutex_unlock(&q->mtx);
}
3 голосов
/ 05 августа 2011

В качестве альтернативы ответу cnicutar вы можете просто использовать очереди сообщений POSIX , которые позаботятся о проблемах синхронизации в ядре. Для системных вызовов будут некоторые небольшие издержки, которые могут вызывать или не вызывать беспокойство. Это довольно минимально, так как ядро ​​в любом случае выполняет все, что вам придется делать вручную.

Пользовательские потоки могут просто блокироваться на mq_receive, и если вы создаете специальный тип сообщения очереди, это позволяет легко определить потоки, когда завершить работу.

...