代码之家  ›  专栏  ›  技术社区  ›  Adrian

Delphi(Indy)线程安全类

  •  1
  • Adrian  · 技术社区  · 14 年前

    假设我有一些类,TMaster,它作为一个字段包括一个TIdTCPServer。TMaster类的某些方法负责TIdTCPServer的OnExecute事件。

    首先,这是线程安全和可接受的吗?其次,让我们假设我的类有许多其他私有字段(名称、日期、任何…)。OnExecute事件(它实际上是TMaster类中的一个方法)是否可以安全地写入这些变量?

    我想我的意思是问,在这种情况下,私人领域是否安全?

    我真的是线程的新手,任何帮助都将不胜感激!

    谢谢 阿德里安!

    2 回复  |  直到 14 年前
        1
  •  4
  •   Mike Taylor    7 年前

    我处理此问题的方式不是让事件使用的字段属于 TidTCPServer 所有者,但定义自定义 TidContext 子体,并将字段添加到该类中。

    然后你只需设置 ContextClass 属性设置为自定义上下文的类型。这样,每个连接/线程都将获得自己的自定义上下文,其中包含自己的私有字段,这样就不会出现线程访问相同字段的问题。

    如果您有一个需要由不同上下文访问的对象列表,那么您有两个选项。

    1) 为每个上下文实例创建对象副本并将其存储在中的专用字段中 这可以在 OnConnect 事件

    2) 使用同步器保护对象免受并发线程访问,例如 TIdCriticalSection , TMultiReadExclusiveWriteSynchronizer 或信号量,

    你使用哪种方法取决于每种情况。

    如果您需要操作任何vcl组件,请记住,这不能在主vcl线程之外安全地完成,因此您应该创建自己的 tidnotify 这是一个体面的人。使用执行此类操作 tidsynch 在停止时可能导致死锁 tidtcpserver 如果它正在进行vclsynch操作。

    这只是我在使用印地的几年中学到的一些东西。

        2
  •  2
  •   Remy Lebeau    14 年前

    TIdTCPServer 是一个多线程组件。无论你用什么包裹它 OnExecute 事件将始终在工作线程的上下文中触发,每个连接的客户端一个,所以您放入处理程序中的任何代码都必须是线程安全的。成员 TMaster 类需要足够的保护,防止多个线程同时进行并发访问。