像 std::vector && 朋友这样的容器(我实际上正在使用 QList)是否会抛出一个可捕获的异常,或者如果一个线程在另一个线程正在读取容器时尝试写入容器,它是未定义的行为:
std::vector<std::string> stuff;
另一个线程中的非关键任务(例如拼写检查):
try {
for (std::string& s : stuff) {
//do stuff with s
}
} catch (...) { // Handle all exceptions
//bail out of task
}
主线程:
stuff.erase(std::remove(someIterator), stuff.end());
所以你可以看到这里会有一个场景,它可能有一个无效的迭代器,并且将在读取线程中抛出一个异常 - 这将被捕获并退出任务。
但这只是一种情况——我是否可以依靠从这些容器中抛出可捕获的异常,这样我就不需要使用互斥锁来保护向量或字符串?或者在某些情况下它可能会取消引用 nullptr(或其他东西)并导致 SEH 异常 - 即我无法捕获并继续的事情。我认为答案是它可能依赖于实现,并且很可能会导致未定义的行为,但我想我会问这个问题。