我是否需要一个关键部分来获取字符串列表中值的索引?

时间:2014-05-31 17:27:27

标签: multithreading delphi critical-section

我有一个大约100个值的字符串列表myStringList,我正在对它进行异步访问。我想知道这样做是否是线程安全的:

currentIndex := myStringList.IndexOf(wantedValue);

或者我总是要这样做:

criticalS.Enter;
try
  currentIndex := myStringList.IndexOf(wantedValue);
finally
  criticalS.Leave;
end;

3 个答案:

答案 0 :(得分:4)

您绝对需要使用锁来保护对可变字符串列表的所有访问。如果编写器线程在您的线程读取时修改了列表,则代码可能会失败。您可以引用已销毁的字符串。或者在您阅读时,列表可能会重新分配到不同的地址。

您需要对所有访问使用相同的锁,包括读取和写入。您可以使用多个读取,独占写锁定而不是关键部分。但是你确实需要某种形式的同步。

如果所有线程都从列表中读取,并且没有线程以任何方式修改它,那么您不需要锁定。

答案 1 :(得分:2)

这是一个非常好的线程安全的TStringList,我已经非常成功地使用了它。

Tilo Eckert撰写的TThreadStringList http://www.swissdelphicenter.ch/torry/showcode.php?id=2167

它非常清楚地展示了关键部分技术。

答案 2 :(得分:1)

如果你没有使用任何其他线程的字符串(添加/插入/删除)进行操作(意思是数据存在而且它是静态的),则不需要锁定。