На странице, на которую вы ссылаетесь, "mutex" - это фактический низкоуровневый синхронизирующий примитив. Вы можете взять мьютекс и затем освободить его, и только один поток может взять его одновременно (следовательно, это синхронизирующий примитив). Рекурсивный мьютекс - это тот, который может быть взят одним и тем же потоком несколько раз, а затем один и тот же поток должен быть освобожден столько раз, чтобы другие могли его взять.
"Блокировка" - это просто класс-оболочка C ++, который принимает мьютекс в своем конструкторе и освобождает его в деструкторе. Это полезно для установления синхронизации для областей C ++.
Переменная условия - это более продвинутая / высокоуровневая форма синхронизирующего примитива, которая объединяет блокировку с механизмом «сигнализации». Он используется, когда потокам нужно ждать, пока ресурс станет доступным. Поток может «ждать» CV, а затем производитель ресурсов может «сигнализировать» о переменной, и в этом случае потоки, которые ожидают CV, получают уведомление и могут продолжить выполнение. Мьютекс объединяется с CV, чтобы избежать состояния гонки, когда поток начинает ожидать CV, в то время как другой поток хочет сигнализировать об этом; тогда не контролируется, доставлен или потерян сигнал.