, , , , - :
void *
routine (void * argument)
{
left_arg = f (argument);
right_arg = f (argument);
pthread_create (left_child, NULL, routine, left_arg);
pthread_create (right_child, NULL, routine, right_arg);
pthread_join (left_child, &left_return_val);
pthread_join (right_child, &right_return_val);
}
, " " :
void *
routine (void * argument)
{
left_arg = f (argument);
right_arg = f (argument);
pthread_create (left_child, NULL, routine, left_arg);
right_return_val = routine (right_arg);
pthread_join (left_child, &left_return_val);
}
, N , . , - .. , P , , kP, , , " kP . , , kP , :
THREAD_POOL pool = new_thread_pool (k * P);
void *
routine (void * argument)
{
left_arg = f (argument);
right_arg = f (argument);
left_thread = get_worker (pool);
right_thread = get_worker (pool);
pthread_join (left_child, &left_return_val);
pthread_join (right_child, &right_return_val);
put_worker (pool, left_thread);
put_worker (pool, right_thread);
}