Как уже обсуждали другие, параллелизм (и в частности безопасность потоков) - это архитектурная проблема, которая влияет на то, как вы проектируете свою систему и свое приложение.
Но я хотел бы ответить на ваш вопрос о напряженности между безопасностью исключений и безопасностью потоков.
На уровне класса потокобезопасность требует изменений в интерфейсе. Так же, как исключение безопасности. Например, классы обычно возвращают ссылки на внутренние переменные, например:
class Foo {
public:
void set_value(std::string const & s);
std::string const & value() const;
};
Если Foo используется несколькими потоками, вас ждут проблемы. Естественно, вы можете поставить мьютекс или другую блокировку для доступа к Foo. Но довольно скоро все программисты на C ++ захотят заключить Foo в ThreadSafeFoo. Я утверждаю, что интерфейс для Foo должен быть изменен на:
class Foo {
public:
void set_value(std::string const & s);
std::string value() const;
};
Да, это дороже, но его можно сделать поточно-ориентированным с помощью замков внутри Foo. IMnsHO это создает определенное напряжение между безопасностью потоков и безопасностью исключений. Или, по крайней мере, вам нужно провести дополнительный анализ, поскольку каждый класс, используемый в качестве общего ресурса, должен быть исследован в обоих источниках.