我有一个大约100个值的字符串列表myStringList
,我正在对它进行异步访问。我想知道这样做是否是线程安全的:
currentIndex := myStringList.IndexOf(wantedValue);
或者我总是要这样做:
criticalS.Enter;
try
currentIndex := myStringList.IndexOf(wantedValue);
finally
criticalS.Leave;
end;
答案 0 :(得分:4)
您绝对需要使用锁来保护对可变字符串列表的所有访问。如果编写器线程在您的线程读取时修改了列表,则代码可能会失败。您可以引用已销毁的字符串。或者在您阅读时,列表可能会重新分配到不同的地址。
您需要对所有访问使用相同的锁,包括读取和写入。您可以使用多个读取,独占写锁定而不是关键部分。但是你确实需要某种形式的同步。
如果所有线程都从列表中读取,并且没有线程以任何方式修改它,那么您不需要锁定。
答案 1 :(得分:2)
这是一个非常好的线程安全的TStringList,我已经非常成功地使用了它。
Tilo Eckert撰写的TThreadStringList http://www.swissdelphicenter.ch/torry/showcode.php?id=2167
它非常清楚地展示了关键部分技术。
答案 2 :(得分:1)
如果你没有使用任何其他线程的字符串(添加/插入/删除)进行操作(意思是数据存在而且它是静态的),则不需要锁定。