Звучит так, будто вы хотите не ждать окончания / завершения потока, а ждать
сигнализировать, что это сделано с работой, чтобы вы могли кормить их больше работы.
Что бы я сделал, это
создать 5 рабочих очередей и 1 очередь результатов работы
5 потоков зацикливаются, выбирая работу из своей рабочей очереди и отправляя результаты обратно в ту же очередь результатов.
Основной поток (отправка работы в 5 потоков) будет выглядеть примерно так:
for(;;) {
struct threadmessage msg;
struct *work_result;
struct *work;
thread_queue_get(&result_queue,NULL,&msg);
work_result = msg->data;
handle_result(work_result);
work = get_more_work();
thread_queue_add(worK_result->queue,work,0);
free_work_result(work_result);
}
Каждый из 5 рабочих потоков (обработка некоторой работы, отправка результата обратно в основной поток) будет выполнять:
for(;;) {
struct threadmessage msg;
struct *work_result;
struct *work;
thread_queue_get(my_queue,NULL,&msg);
work = msg->data;
process(work_result);
work_result->queue = my_queue;
thread_queue_add(&result_queue,work_result,0);
free_work(work);
}
Код для реализации такой очереди находится здесь:
http://asgaard.homelinux.org/svn/threadqueue/