簡體   English   中英

目標C,將Java中的volatile轉換為Objective C的最佳方法是什么?

[英]Objective C, What is the best way to convert volatile in Java into Objective C?

我正在嘗試將Java代碼轉換為Objective C代碼。 並且java代碼包含定義為volatile的變量。 我在網上查看了java中的“volatile”用法,如下所示

 Essentially, volatile is used to indicate that a variable's value will be modified by different threads.

所以,如果我要在Objective C中將變量設置為volatile,因為變量將由不同的線程訪問,那么我不需要將這些變量設置為volatile,因為我可以將這些變量設置為atomic?

volatile關鍵字也存在於Objective-C中。 你可以使用它。

這是因為Objective-C是C的超集。

將屬性聲明為atomic屬性將無法糾正volatile意圖。 volatile有效地告訴編譯器不要優化對該變量進行的檢查,因為當編譯器期望它保持不變時它可能已經改變了。

最簡單的例子就是這樣。 假設我們有一個全局變量聲明為:

int packetsReceived = 0;

它后來使用如下:

packetsRecieved = 0;

while (packetsRecieved < 10){
    //Wait for more packets
}

processPackets();

我們永遠不會通過那個循環,因為編譯器會說“嘿,在這個循環中從不修改packetsRecieved ,因此它將無限運行”。 因此,它只會使它成為一個直的無限循環,因此它可以避免每次都檢查。

如果我們改為將變量聲明為:

volatile int packetsRecieved;

我們告訴編譯器這個變量可能隨時改變,即使它看起來應該保持不變。 因此在我們的示例中,編譯器生成的機器代碼仍將檢查條件,並且我們的程序將按預期工作。

不, atomicvolatile物不是一回事。

atomic (在屬性聲明中)意味着getter / setter將確保獲取/設置整個值,而不管其他線程可能同時執行什么操作。

volatile是編譯器的一個指示器,可以通過其他方式(其他線程,內存映射的IO設備)修改變量,因此它不應該優化(看似)該變量的不必要的加載/存儲。 這與Java中的含義相似,盡管Java增加了一些關於內存障礙和C(和Objective-C)不提供的讀寫順序的保證。 特別是在C語言中,簡單地聲明變量volatile不足以從多個線程wikipedia:volatile變量中安全地使用它。

在不同線程之間共享可變對象可能是一個令人頭疼的問題並導致難以追蹤的錯誤。 Objective-c對不可變對象有很大的偏好。 我建議如果可能的話,你會找到一種方法來傳遞不可變對象,如果可能的話。 然后,您根本不必擔心共享對象被寫入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM