2009-12-01 77 views
9

我在多個地方閱讀了Boost.Signals不是線程安全的,但我還沒有找到更多關於它的細節。這個簡單的引用並沒有說太多。現在大多數應用程序都有線程 - 即使它們嘗試使用單線程,它們的一些庫也可能使用線程(例如libsdl)。Boost:Boost.Signals中的線程安全究竟是什麼?

我想實現沒有其他線程沒有訪問插槽的問題。所以在這個意義上,它至少是線程安全的。

但究竟什麼工作,什麼不會工作?只要我沒有同時訪問它,它是否可以在多線程中使用它?即如果我在插槽周圍建立自己的互斥鎖?

或者我只是在我創建它的那個線程中強制使用槽?或者我第一次使用它的地方?

+0

這已經有一段時間了......我的回答是否合理?基本上,信號庫*本身*不會崩潰,無論你從任何線程所做的調用,只要它們是「有效的」......但是你要對自己的代碼中的語義負責。 – HostileFork 2010-03-11 00:47:31

+0

這是有道理的,但它並不真正回答我所有的問題。 :)基本上你說過「在源代碼中查找」。我會稍後再做,然後在這裏發佈所有我的問題的確切答案。 – Albert 2010-03-11 11:20:05

+0

你確實問過「究竟有效,哪些不起作用?」我覺得這比解析狹義的具體問題更重要。(這些答案是「是的:如果你用一個互斥體來防守是好的,但是如果你的插槽的語義是一次多於一個的線程可以運行它們,這可能是不必要的;就像從多個線程調用任何其他函數一樣」和「不:你不限於只在創建它們的線程中使用插槽」) – HostileFork 2010-03-11 17:09:51

回答

5

我不認爲這是太清楚或者,和圖書館評審said here之一:

我也並不喜歡這一事實,只有三次「線」字而得名。 Boost.signals2希望成爲'線程安全信號'庫。因此,更多 的細節和特別是關於該區域的更多示例應該給予用戶 。

找出它的一種方法是go to the source並查看它們使用_mutex/lock()來保護它們。那麼想象一下如果這些電話不在那裏會發生什麼。 :)

從我可以收集,它確保簡單的事情,如「如果一個線程正在做連接或斷開連接,這將不會導致通過附加到這些信號的插槽迭代不同的線程崩潰」。有點像使用線程安全版本的C運行時庫確保如果兩個線程同時對printf進行有效調用,那麼不會發生崩潰。 (不是說你會得到將使任何意義輸出—你仍然負責高階語義。)

這似乎 並不像Qt的,其中螺紋某個信道的代碼運行基於目標插槽的「線程親和性」(這意味着發出信號可以觸發許多不同線程上的插槽並行運行)。但我認爲不支持這一點是爲什麼boost :: signal「combiners」可以do things like this

0

我看到的一個問題是,一個線程可以連接或斷開連接,而另一個線程正在發送信號。

你可以很容易地包裝你的信號,並與互斥呼叫連接。然而,包裝連接並非微不足道。 (連接返回您可以用來斷開連接的連接)。