假設我有一個線程安全的Things集合(稱之爲ThingList),並且我想添加以下函數。以線程安全的方式返回指針
Thing * ThingList::findByName(string name)
{
return &item[name]; // or something similar..
}
但是通過這樣做,我已經委派線程安全調用代碼的責任,這將不得不做這樣的事情:
try
{
list.lock(); // NEEDED FOR THREAD SAFETY
Thing *foo = list.findByName("wibble");
foo->Bar = 123;
list.unlock();
}
catch (...)
{
list.unlock();
throw;
}
顯然,一個RAII鎖定/解鎖對象將簡化/刪除try/catch/unlocks,但調用者仍然很容易忘記。
有我看了幾個備選方案:由價值
- 回報的事情,而不是 指針 - 精細除非你需要 修改事
- 添加功能
ThingList::setItemBar(string name, int value)
- 罰款,但這些傾向於 激增 - 返回一個類似指針的對象,它在創建時鎖定列表並在銷燬時再次解鎖它。不知道這是好還是壞的做法...
什麼是正確的方法來處理這個問題?
「合併」是不錯後是安全的,但有一個隱藏的假設,即事情的對象知道如何找到自己的名單。你也可以通過「key」來合併,但是你有合併已被刪除的項目的問題...... – Roddy 2010-04-20 18:45:52