Я на самом деле не очень хорошо понимаю, как следует синхронизировать потоки. Если есть какой-то блок кода, который должен быть выполнен сериализованным способом, тогда pthread_mutex_lock должен быть достаточно хорошим. Если порядок операций должен быть сохранен (1,2,3,1,2,3), я предлагаю использовать pthread_mutex_lock вместе с некоторой переменной, указывающей, какой поток может войти в критическую секцию сейчас.
// id_to_go iterates from 0 up to number_of_thread - 1
// each thread has my_id from the same range
while(1)
{
pthread_mutex_lock(mutex);
if (id_to_go == my_id)
{
// set to next thread id
id_to_go = (id_to_go + 1) % number_of_threads;
}
else
{
// it's not our turn, try again
pthread_mutex_unlock(mutex);
continue;
}
handle_the_client;
pthread_mutex_unlock(mutex);
}