做容器,如性病::矢量& &朋友(我實際使用的QList)拋出一個異常開捕或者是不確定的行爲,如果一個線程試圖寫入時另一個線程從它讀取容器:做std容器總是在多線程環境中拋出異常嗎?
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異常 - 即我無法捕獲並繼續的東西。我認爲答案是它可能是依賴於實現的,並且很可能會導致未定義的行爲,但我想我會問這個問題。
在C++ 11之前肯定沒有保證,因爲線程沒有正式存在。我認爲他們之後也不會添加任何內容,因爲在單線程程序中,這是不必要的開銷。 –
我認爲答案可能是「沒有保證」,但希望它能在某個地方列入標準。 – gremwell
這是未定義的行爲。你不能依賴拋出異常,代碼更可能出錯。 –