Принимая во внимание, что вы создаете безымянный мьютекс, каждый поток создаст свой собственный безымянный мьютекс и при создании принимает на себя ответственность. Поскольку каждый поток имеет свой собственный мьютекс, все потоки смогут работать параллельно.
Таким образом, вы должны создать мьютекс один раз для всех потоков, если вы хотите, чтобы он был неназванным. Просматривая свой код, вы также должны проверить, успешно ли создано мьютекс.
Затем в функции, которая вызывается из нескольких потоков, вызывается WaitForSingleObject для ранее созданного мьютекса.
Проверьте возвращенный результат, если он вернулся, потому что вы получили владелец мьютекса или ожидание было прервано, потому что мьютекс был отменен.
Убедитесь, что вы вызываете ReleaseMutex для дескриптора мьютекса, если у вас есть владелец. Вероятно, вам следует подумать об использовании RAII для управления мьютексом по многим причинам (чтобы убедиться, что мьютекс правильно освобождается при возникновении исключений или при вставке оператора возврата перед ReleaseMutex, чтобы назвать лишь несколько).
Когда мьютекс больше не нужен, обязательно вызовите CloseHandle для MutexHandle.
Пример использования мьютексов см. Здесь: «Использование объектов мьютекса»
Базовую многопоточную оболочку см. Здесь: Использование потоков