我有一個線程安全的類,一個取消令牌,從一個不穩定的可變狀態(未取消)轉換到一個穩定的不可變狀態(取消)。一旦一個實例變得不可變,我想在檢查狀態之前停止獲取鎖的成本。做一個原子讀取目標-C
這裏的是什麼東西像現在的簡化:
-(bool) isCancelled {
@synchronized(self) {
return _isCancelled;
}
}
-(bool) tryCancel {
@synchronized(self) {
if (_isCancelled) return false;
_isCancelled = true;
}
return true;
}
,我想什麼嘗試:
-(bool) isCancelled {
bool result;
// is the following correct?
// can the two full barriers be reduced to a single read-acquire barrier somehow?
OSMemoryBarrier();
result = _isCancelled != 0;
OSMemoryBarrier();
return result;
}
-(bool) tryCancel {
return OSAtomicCompareAndSwap32Barrier(0, 1, &_isCancelled);
}
使用兩個內存屏障正確的做法?我應該如何期望它與獲取鎖的成本(在此插入關於分析的標準不一致)?有沒有更便宜的方法來做到這一點?
我已經刪除了我的答案,因爲你不明白。對於文檔中的內容,您應該知道還有其他函數,這些函數由Apple代碼調用。在從版本到版本的Apple中,喜歡更改他的代碼並聲明某些功能已被棄用,並且在下一版本中完全刪除它。這是現實,這是不是在文件中,但在現實生活中 – 2013-10-21 17:03:21
@matheszabi蘋果公司不會貶低原子功能。這些不是UI函數,它們在每個版本中都獲得特性並略有改變,它們是無處不在的算法所使用的基本構建模塊。 –