Использование массива для синхронизации не является потокобезопасным, но только "sync.Contains (false)".
Что если два потока запущены sync.Contains (false) одновременно и оба возвращаются false?
Кроме того, я вижу, что ваш ThreadCount является квадратом sideSize. Создание большого количества потоков очень неэффективно. чем больше у вас потоков, тем больше у вас переключений контекста. Переключение контекста составляет около 8000 тактов. Кроме того, создание потока стоит около 100 000 тактов, и каждый поток должен иметь свой собственный стек, который по умолчанию составляет около 4 МБ.
Вам нужно столько же потоков, сколько ядер, и каждый поток извлекает из очереди и обрабатывает свою работу.
Возможно, вам лучше использовать пул потоков, но я также вижу, что ваши потоки через некоторое время (правда), что означает, что они никогда не заканчиваются. Пул потоков не предназначен для длинных потоков.
В целом, я думаю, что ваш дизайн нуждается в некоторой работе. Поскольку вы, кажется, учитесь, я бы порекомендовал проект, который позволяет использовать пул потоков вместо циклов while (true).
Кто-то другой может дать вам «имя» для известного шаблона дизайна, который будет работать для вас, но я не знаю названия шаблонов дизайна.