Multithreading 如何在Delphi中实现线程安全列表包装器?

Multithreading 如何在Delphi中实现线程安全列表包装器?,multithreading,delphi,semaphore,critical-section,Multithreading,Delphi,Semaphore,Critical Section,我有一个列表包装器,它维护两个tstringlist和一个TClassList 我需要它是线程安全的,这样: 不允许并发写入(应输入某种类型的等待状态) 不允许边读边写(反之亦然)(应输入某种等待状态) 允许并发读取 有什么办法可以做到这一点吗?我的直觉告诉我,它需要的不仅仅是一个关键部分,也许是一个信号量或“使用计数器”,也许是其中一个与CS结合使用 我只是不太确定从哪里开始——从英语的整体方法到psuedo代码,再到delphi实现或外部链接,我都非常感激。您应该看看sysutils.p

我有一个列表包装器,它维护两个tstringlist和一个TClassList

我需要它是线程安全的,这样:

  • 不允许并发写入(应输入某种类型的等待状态)
  • 不允许边读边写(反之亦然)(应输入某种等待状态)
  • 允许并发读取
有什么办法可以做到这一点吗?我的直觉告诉我,它需要的不仅仅是一个关键部分,也许是一个信号量或“使用计数器”,也许是其中一个与CS结合使用


我只是不太确定从哪里开始——从英语的整体方法到psuedo代码,再到delphi实现或外部链接,我都非常感激。

您应该看看sysutils.pas中声明的TMultiReadExclusiveWriteSynchronizer类…

看看本教程。


看看第11章,但都是好东西。

你真的应该看看TThread列表

方法.Add、.Remove、.Clear会自动为您锁定列表。如果需要,您还可以根据需要锁定/解锁:

x.LockList; 
try 
  //do whatever
finally  
  x.Unlocklist; 
end;

TMultiReadExclusiveWriteSynchronizer是一个伟大的想法,但我不知道他们是否解决了所有的bug。它总是在加载时出现问题。

可能是RTL中最长的类名:)他们可以很容易地将其命名为TMREWS,他们可以很容易地将其命名为tgreeneidea,并传递与TMREWS一样多的信息。不要害怕长标识符名称。@Steve它被称为
TMREWSync
Awesome链接。几年前,当我在Delphi做更多的工作时,本可以用这个!这不是OP想要的,因为LockList()将列表锁定为独占访问-因此并行读取访问是不可能的。我完全不知道TThreadList甚至存在到现在。在我的代码中,我一直在使用TStringList对象来处理各种关键部分。这将使生活更简单!