假设我有一个线程安全的物品集合(称之为ThingList),我想添加以下函数。
显然,RAII锁定/解锁对象可以简化/删除try/catch/unlock,但调用者仍然容易忘记。
我看了几个替代方案:
- 返回Thing的值,而不是指针 - 除非需要修改Thing,否则可以接受。 - 添加函数ThingList::setItemBar(string name, int value) - 可以接受,但这些 tend to proliferate。 - 返回类似指针的对象,在创建时锁定列表,在销毁时解锁。不确定这是否是好的实践...
处理这个问题的正确方法是什么?
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/unlock,但调用者仍然容易忘记。
我看了几个替代方案:
- 返回Thing的值,而不是指针 - 除非需要修改Thing,否则可以接受。 - 添加函数ThingList::setItemBar(string name, int value) - 可以接受,但这些 tend to proliferate。 - 返回类似指针的对象,在创建时锁定列表,在销毁时解锁。不确定这是否是好的实践...
处理这个问题的正确方法是什么?