假設我有一個 Map(編程語言無關緊要)并且想一點一點地填滿它們。有人可以展示如何在給定讀寫鎖的情況下使這個執行緒安全(并行讀取、獨占寫入)嗎?
下面是一些 pdeudo 代碼,它不是執行緒安全的,可以開始使用:
def get_or_create_item(item_id)
if (!@map.has_key?(item_id))
@map[item_id] = create_item()
end
return @map[item_id]
end
def create_item
#...
end
假設你有,如何使它成為執行緒安全的
read_lock.lock()
read_lock.release()
write_lock.lock()
write_lock.release()
可用的?
謝謝
uj5u.com熱心網友回復:
帶有讀寫鎖物件的偽代碼如下所示:
ReaderWriterLock rwLock // initially unlocked
getOrCreate(id)
// try getting
rwLock.acquireRead()
optional res = map[id]
rwLock.releaseRead()
if (res.hasValue)
return res
// since we are here, the item isn't in the map
rwLock.acquireWrite()
res = map[id]
// check again if another thread inserted the item while we were waiting for the write lock
if (!res.hasValue)
res = createItem()
map[id] = res
rwLock.releaseWrite()
// at this point res must have a value
return res
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/454573.html
