Delphi(Indy)Threadsafe类

时间:2012-07-25 03:31:40

标签: multithreading delphi indy

假设我有一些类,TMaster,其中asa字段包含TIdTCPServer。 TMaster类的某些方法负责TIdTCPServer的OnExecute事件。

首先,这是线程安全和可接受的吗?其次,让我们假设我的类有许多其他私有字段(Name,Date,anything ......)OnExecute事件 - 这实际上是一个INSOLE TMaster类的方法,可以安全地写入这些变量吗?

我想我的意思是在这种情况下询问私有字段是否是线程安全的?

我非常擅长穿线,非常感谢任何帮助!

谢谢, 阿德里安!

2 个答案:

答案 0 :(得分:4)

我接近这个的方法是不让事件使用的字段属于TidTCPServer 所有者,但我创建了一个定义自定义TidContext后代并将字段添加到该类。

然后,您只需将服务器类上的ContextClass属性设置为自定义上下文的类型即可。这样,每个连接/线程将获得其自己的包含其自己的私有字段的自定义上下文,这样对并发线程访问相同字段没有任何问题。

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

1)创建对象的副本并将它们存储在每个上下文实例的私有字段中 这可以在OnConnect事件中完成。

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

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

如果你需要操作任何vcl组件,请记住这不能安全地在主vcl线程之外完成,因此你应该为此创建自己的tidnotify后代。使用tidsynch执行此类操作可能会导致在tidtcpserver处于vclsynch操作过程中停止时出现死锁。

这只是我在使用Indy几年的过程中学到的一些东西。

答案 1 :(得分:2)

TIdTCPServer是一个多线程组件。无论你将它包装在什么内容中,OnExecute事件将始终在工作线程的上下文中触发,每个连接的客户端都有一个,因此放在处理程序中的任何代码都必须是线程安全的。 TMaster类的成员需要同时保护多个线程并发访问。