Я пытаюсь реализовать базовый сервер на основе архитектуры параллелизма лидера / последователя.Первоначально я пытался просто создать пул потоков и создать очередь из потоков, но после прочтения этого ответа ( Объяснение шаблона "Лидер / Последователь" ) я чувствую, что мой алгоритм неверен, потому что выбранный ответ требуетчто мьютекс не нужен.
Идея, стоящая за лидером / последователем, заключается в том, что вы инициализируете пул потоков, и один поток служит потоком «лидера», а остальные являются потоками «последователя».На сервере поток-лидер будет прослушивать входящие соединения, а поток-подписчик - все остальные.Когда поток лидера обнаруживает входящее соединение, один из оставшихся потоков последователей будет переведен в новый поток лидера, в то время как бывший лидер принимает соединение и обслуживает запрос.Когда бывший ведущий поток завершил обработку запроса, он становится покоящимся следящим потоком.
Однако я не вижу способа реализовать это без использования мьютекса и переменной условия.В настоящее время моя реализация использует пул потоков и просто позволяет каждому потоку принимать новые соединения в мьютексе.
Может кто-нибудь дать объяснение высокого уровня реализации лидера / последователя?
Вот некоторый код, которыйЯ написал о моей текущей реализации.
#define THREAD_COUNT 10
pthread_mutex_t request_tx;
int main(int argc, char* argv[])
{
pthread_t threadA[THREAD_COUNT];
pthread_mutex_init(&request_tx, NULL);
//initialize server socket stuff
for (int i = 0; i < THREAD_COUNT; ++i)
{
pthread_create(&threadA[i], NULL, rest, NULL);
}
for (int i = 0; i < THREAD_COUNT; ++i)
pthread_join(threadA[i], NULL);
return 0;
}
void* rest(void* kargs)
{
int client_fd;
struct sockaddr_in cli_addr;
socklen_t sin_t = sizeof(cli_addr);
while (1)
{
pthread_mutex_lock(&request_tx);
client_fd = accept(server_fd, (struct sockaddr*) &cli_addr, &sin_t);
if (client_fd > 0)
serve(client_fd);
else
pthread_mutex_unlock(&request_tx);
}
}
void serve(int client_fd)
{
pthread_mutex_unlock(&request_tx);
// serve request here
...
}