【问题标题】:How can I implement a thread-safe list wrapper in Delphi?如何在 Delphi 中实现线程安全的列表包装器?
【发布时间】:2008-11-19 16:54:12
【问题描述】:

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

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

  • 不允许并发写入(应进入某种等待状态)
  • 不允许边读边写(反之亦然)(应进入某种等待状态)
  • 允许并发读取

关于如何做到这一点的任何想法?我的直觉告诉我,它需要的不仅仅是一个关键部分,也许是一个信号量或“使用计数器”,也许是其中之一与 CS 结合。

我只是不太确定从哪里开始 - 从英语的整体方法到伪代码,再到 delphi 实现或外部链接,我将不胜感激。

【问题讨论】:

    标签: multithreading delphi semaphore critical-section


    【解决方案1】:

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

    【讨论】:

    • 可能是 RTL 中最长的类名 :)
    • 他们可以很容易地称它为 TMREWS
    • 他们可以轻松地将其命名为 TGreenIdea,并像 TMREWS 一样传达尽可能多的信息。不要害怕长标识符名称。
    • @Steve 叫TMREWSync
    【解决方案2】:

    看看这个教程。 Threading the Delphi Way

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

    【讨论】:

    • 很棒的链接。几年前我在 Delphi 做更多事情时可以使用它!
    【解决方案3】:

    你真的应该看看 TThreadList。

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

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

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

    【讨论】:

    • 这不是 OP 想要的,因为 LockList() 锁定列表以进行独占访问 - 因此并行读取访问是不可能的。
    • 我完全不知道 TThreadList 直到现在还存在。我一直在我的代码中使用带有各种 CriticalSection 的 TStringList 对象。这将使生活变得更简单!
    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 2013-12-18
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多