2014-10-28 35 views
0

讓我們看看這段代碼:當在另一個線程上執行塊時,我應該使用'volatile'和'__block'限定符嗎?

- (void)addOperationAndWait:(void (^)())operation { 
    __block NSException *exception = nil; 
    [self.queue addOperationWithBlock:^{ 
    @try { 
     operation(); 
    } 
    @catch (NSException *ex) { 
     exception = ex; 
    } 
    }]; 
    [self.queue waitUntilAllOperationsAreFinished]; 
    if (exception) { 
    @throw exception; 
    } 
} 

這些代碼行是在一個線程中執行:

exception = ex; 

__block NSException *exception = nil; 

    if (exception) { 
    @throw exception; 
    } 

,這行代碼是在另一個線程執行

所以我應該聲明exception變量爲volatile以確保該變量的值沒有被緩存b ❖使用它的線程?

我有一個疑問,因爲這片文檔的:

volatile變量應用另一類型的內存限制的個別變量。編譯器通常通過將變量的值加載到寄存器中來優化代碼。對於局部變量,這通常不是問題。如果變量從另一個線程可見,但是這樣的優化可能會阻止其他線程注意到它的任何更改。將volatile關鍵字應用於變量會強制編譯器在每次使用時從內存加載該變量。如果它的值可以在任何時候通過外部源被改變,編譯器可能無法檢測

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html

+0

我建議你找出爲什麼會拋出異常。 Objective-C規則是隻應拋出異常來指示編程錯誤。你不抓住它們,你修復代碼。 – gnasher729 2014-10-28 08:21:32

+0

@ gnasher729感謝您的回覆。但異常並不是這裏最重要的事情。這只是一個明顯的例子。我有一些類似的情況是我的代碼,我不知道像這樣的代碼 - 沒有'volatile'限定符 - 是完全可靠的。 – wdmczk 2014-10-28 09:11:24

回答

1

波動不利於對多線程訪問你可能一個變量聲明爲揮發性變量全部爲。使用原子操作,或使用原子屬性。

0

volatile當變量可以被編譯器無法看到的東西改變時使用。在這裏,編譯器可以看到發生的一切。

相關問題