Одно правило, которое каждый программист быстро узнает о многопоточности:
Если более чем один поток имеет доступ к структуре данных, и хотя бы один из потоков может изменить эту структуру данных, то вам лучше сериализовать все обращения к этой структуре данных, иначе вы столкнетесь с проблемой отладки.
Обычно эта сериализация выполняется через мьютекс - то есть поток, который хочет прочитать или записать структуру данных, блокирует мьютекс, делает все, что ему нужно, а затем разблокирует мьютекс, чтобы снова сделать его доступным для других потоков.
Это подводит меня к вопросу: куча памяти процесса - это структура данных, которая доступна нескольким потокам. Означает ли это, что каждый вызов по умолчанию/не перегруженный new
и delete
сериализуется мьютексом глобального процесса и, следовательно, является потенциальным узким местом сериализации, которое может замедлять многопоточные программы? Или современные реализации кучи избегают или смягчают эту проблему, и если да, то как они это делают?
(Примечание: я помечаю этот вопрос linux
, чтобы избежать правильного, но неинформативного ответа "это зависит от реализации", но мне также было бы интересно услышать о том, как Windows и MacOS/X также делают это, если есть Существенные различия между реализациями)