These two exclusive locks cause a deadlock (at least on win32) because CSettingsManager::Load() can be called recursively. The exact use case is CSettingsManager::Load() calling OnSettingsLoaded(), which calls CAdvancedSettings::OnSettingsLoaded() which in turn calls CSettingsManager::Load().

Wouldn't it be better to minimize the area protected by the locks? In this case that would probably be the call to Deserialize().