从MainThread和其他线程安全访问String变量

时间:2015-11-16 18:53:29

标签: multithreading delphi

嗨在我的多线程应用程序中,一些线程(和MainThread,ofcourse)正在访问全局字符串变量。其他线程只读取值,但主线程可以更改它们。可能是,我仍然需要使用Synchronize?

先生。大卫,会告诉你什么?

var
   maillist:tstringlist;
   mindex:integer; // global variables. 

procedure TMultiThread.Execute;
begin


  while true do
  begin
    if (icount>=0) or (terminated) then
    exit;
    try
      sec.enter; // critical section
      login := maillist.names[mIndex];
      UniqueString(login);
      password:=maillist.ValueFromIndex[mIndex];
      UniqueString(password);
      interlockedincrement(mindex);
    finally
      sec.leave;
    end;
    if terminated then exit;
    if (login=emptystr) or (password=emptystr) then
    continue;

1 个答案:

答案 0 :(得分:1)

对于像字符串这样的复杂对象,为避免竞争条件下的数据损坏,您需要使用同步对象同步访问。例如:

  • TCriticalSection
  • TMonitor
  • TMultiReadExclusiveWriteSynchronizer
  • 超薄读卡器/写入器(SRW)锁定。

除了同步以避免数据损坏之外,您可能还需要同步语义正确性。这一切都取决于数据的使用方式。

作为一般规则,尽可能避免共享数据以避免同步。过度同步会影响可扩展性。

这个答案(https://stackoverflow.com/a/19703381/505088)展示了如何创建一个通用的线程安全类,在本例中使用了一个临界区。您可以通过进行最小的更改,将该想法与上述任何同步对象一起使用。