Распространенным механизмом обработки нескольких потоков является подход «ведущий / ведомый», когда один поток передает задачи другим. Суть этого стиля, который, я думаю, заключается в том, чтобы вы поняли, что даже в подчиненных потоках, каждый поток по сути имеет полный контроль над своим собственным исполнением . Мастер не «заставляет» другие потоки делать что-либо, мастер может сделать запрос, но подчиненный поток должен добровольно принять направление от мастера ... хм ... так что, возможно, мастер / раб здесь нехорошо ... Во всяком случае, общее решение для подчиненных потоков - в псевдокоде
while (!should_exit):
while (!have_something_to_do):
wait_for_something_to_do()
do_the_thing_i_was_waiting_for()
Вы можете довольно легко реализовать эту стратегию в C, используя структуру, подобную следующей (хотя для примера я прибегаю к псевдо-c-иш-коду)
struct Slave {
Mutex thread_lock;
ConditionVariable thread_cv;
int exit_flag;
void (*thread_operation)();
};
void slave_thread( Slave * slave ) {
while( !exit_flag )
{
lock( thread_lock );
while( slave->thread_operation == NULL )
slave->thread_cv.wait( thread_lock );
unlock( thread_lock );
(*slave->thread_operation)(); // do the master's bidding...
}
}
void master_thread()
{
Slave slave1;
Slave slave2;
slave1.thread_operation = NULL;
slave2.thread_operation = NULL;
// create the threads. They'll immediately block on the condition variable
slave1.thread_operation = some_function_pointer;
slave2.thread_operation = some_other_function_pointer;
notify_one( slave1.thread_cv ) // Now that the function pointers are set, wake
notify_one( slave2.thread_cv ) // the slave threads
}
Конечно, это слишком упрощенный пример, но, надеюсь, он даст вам общую идею.