全局狀態

        翻譯自http://aosabook.org/en/zeromq.html中的Global State

        在庫中使用全局變量並不理想.一個庫也許會被程序加載很多次,但即便如此,也只會存在唯一一個全局變量集.


Figure24.1: ØMQ being used by different libraries


        圖24.1中兩個不同且獨立的庫都使用了ZeroMQ,然後應用程序使用了這兩個庫.

        當這種情況出現時,兩個ZeroMQ實例都訪問了相同的變量,會導致競爭條件,奇怪的錯誤和未定義行爲.

        爲了防止這種問題的發生,ZeroMQ庫並沒有全局變量.取而代之的是,由使用該庫的用戶負責顯式創建全局狀態.我們把這個包含全局狀態的對象稱爲context.從用戶的角度看,這個context看起來像是一個工作線程池,而從ZeroMQ的角度看,它只不過是一個存儲我們需要的一些全局狀態的一個對象.在上面這幅圖中,libA會擁有自己的context,libB也同樣擁有自己的context.不會出現其中一個破壞或覆蓋另一個的情況.

        這裏給我們的教訓非常明顯:不要在庫中使用全局狀態.如果你這個做了,那麼當這個庫恰巧被同一個進程實例化了兩次,那麼這個庫很可能會崩潰掉.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章