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

Vik*_*sov 5 delphi multithreading critical-section

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

currentIndex := myStringList.IndexOf(wantedValue);
Run Code Online (Sandbox Code Playgroud)

或者我总是这样做:

criticalS.Enter;
try
  currentIndex := myStringList.IndexOf(wantedValue);
finally
  criticalS.Leave;
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 4

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

您需要对所有访问(读和写)使用相同的锁。您可以使用多次读、独占写锁而不是临界区。但您确实需要某种形式的同步。

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