2014-01-22 80 views
0

如何在多線程環境中訪問全局變量?例如:下面的messageServerUrl變量如何保持線程安全?它足夠原子以保持安全嗎?如果沒有,還有其他解決方案嗎?任何想法請分享,在此先感謝。如何在多線程環境中訪問全局變量?

@property(atomic,copy)NSString * messageServerUrl;

+0

順便說一句 - 'messageServerUrl'不是全局變量。這是一個財產。每個類的實例都有自己的屬性副本。 – rmaddy

+0

@rmaddy呃,這個實例中的所有方法都是全局的,無論它們在哪個線程上運行。事實上,從更深層次上講,變量甚至不是財產;它是一個實例變量。 「屬性」只意味着該實例變量有一個訪問方法。 – matt

+0

@matt屬性不需要實例變量。當然在大多數情況下有一個,但並非總是如此。而術語「全局變量」通常具有與實例變量或屬性不同的含義。 – rmaddy

回答

1

atomic不會奇蹟般地保持線程安全。它只是一個線程安全的訪問器方法。

非常非常非常小心的是什麼使共享價值安全(有時甚至不是這樣!)。如果你從兩個不同的線程中獲得同樣的價值,那麼你的生活仍然會受到嚴重的干擾,從而使你的邏輯處於風險之中。

例如,如果您知道此值是在輔助線程啓動之前設置的,並且您之後所做的所有操作都是使用getter,那麼是的,這可能是安全的。

但多線程之間共享數據的最安全的方法是:不要。如果數據不需要更改,那麼一開始就將它傳遞給輔助線程。這就是爲什麼GCD非常精彩:默認情況下它是串行隊列,加上你將數據傳遞給下一個線程執行的塊,所以你可以在沒有鎖的情況下實現有效的鎖定(這很容易導致錯誤管理)。

+0

謝謝。同意你的看法,如果該變量只讀,那麼對於多線程環境來說OK,否則使用鎖定是最好的方法。 – jianhua

+0

該書<有效目標C>還建議連續GCD解決方案以保持其自動化特性。 – jianhua

+0

我的書也是如此:http://www.apeth.com/iOSBook/ch38.html#_grand_central_dispatch – matt