Когда я впервые занялся написанием ПО с параллельной обработкой, в C++ не было поддержки синхронизации. В самой Windows был лишь набор синхронизирующих примитивов, и все они были реализованы в ядре. В основном я использовал критические секции, если не возникало потребности в синхронизации между процессами, и тогда я применял мьютекс. В общих чертах, эти синхронизирующие примитивы были блокировками, или блокирующими объектами lock objects.
Источник: Windows и C++ – Эволюция синхронизации в Windows и C++.