最近在CodeReview.SE上,我碰到了an answer,它談到了一種叫做「異常嘔吐」的技術。顯然這個技巧用於利用異常必須以線程安全的方式實現,而不管編譯器是否支持thread_local
變量。什麼是「異常嘔吐」?
我粘貼下面這個答案的一部分:
有現有的技術,它是沒有什麼不同被稱爲「異常嘔吐」。注意:
void f(void(*p)()) { p(); } template<typename F> void real_f(F func) { try { throw func; } catch(...) { f([] { try { throw; } catch(F func) { func(); } }); } }
這侵犯的事實,編譯器必須用作例外存儲複雜的對象提供了一個線程本地棧,無論其用於其他線程局部功能的支持,因此享有很大廣泛的編譯器的支持。最明顯的缺點是a)太糟糕了,b)僅限於堆棧語義。
我的問題是,這個技巧究竟是如何工作的,它是「安全的」?
價值的「catch」關係到我一點,還是這個高於我的薪酬等級的東西? – Bathsheba
@Bathsheba這不是我的代碼,我不知道它是如何工作的。這就是爲什麼我在這裏問); –
我明白這一點;我的評論更針對能夠解決這個問題的人 - 我不是其中之一。 – Bathsheba