Здравствуйте, antropolog, Вы писали:
A>В то время как в моём случае:
A>отдельная lock-free очередь на каждый тред
A>NextTask/AddTask работает с конкретной очередью, мьютекс не нужен, поиск в очереди не нужен, добавление/удаление таски — одна CAS операция. Единственный недостаток — теоретическая разбалансировка, я повторюсь — теоретическая, например при малом количестве клиентов, и если у них внезапно совпал id % threadnum (ну или hash(id) % threadnum ). В реальном мире такая разбалансировка практически не встречается, а если встречается то на малом количестве "долгих клиентов" и при невезучем случае.
A>Иными словами — мой алгоритм оптимален для многоих клиентов с мелкими тасками ( т.к. минимальный shared state и отсутствие блокировок).
Твой алгоритм не соответствует условию ТЗ:
S>Не должно быть "повисших" клиентов, даже если клиентов больше, чем потоков.
S>Т.е. поток должен обрабатывать разных клиентов по-очереди, а не одного до завершения всех его задач.
Возьми простой случай одного рабочего потока — никакого "разных клиентов по-очереди" у тебя нет.