Это вопрос дизайна, который уже давно меня беспокоит. На самом деле это довольно просто: когда вы предоставляете библиотеки структур данных, вы встраиваете примитивы безопасности потоков или просто предоставляете конструкции и позволяете системе, использующей их, решать, как реализовать фактические операции.
Быстрый пример, круговой буфер, который поддерживает модель производителя и потребителя. 2 метода, Get и Write, каждый обновляет счетчик заполнения глобальной переменной. Теперь вы можете просто предоставить мьютексы для блокировки и позволить коду, использующему буфер, захватить мьютексы ИЛИ выполнить внутреннюю блокировку и обеспечить взаимное исключение из коробки.
Похоже, что в STL это делается извне, но есть причины производительности, по которым вы хотели бы обеспечить более тонкую блокировку.
Мысли?