假设我有一些类,TMaster,其中asa字段包含TIdTCPServer。 TMaster类的某些方法负责TIdTCPServer的OnExecute事件。
首先,这是线程安全和可接受的吗?其次,让我们假设我的类有许多其他私有字段(Name,Date,anything ......)OnExecute事件 - 这实际上是一个INSOLE TMaster类的方法,可以安全地写入这些变量吗?
我想我的意思是在这种情况下询问私有字段是否是线程安全的?
我非常擅长穿线,非常感谢任何帮助!
谢谢, 阿德里安!
答案 0 :(得分:4)
我接近这个的方法是不让事件使用的字段属于TidTCPServer
所有者,但我创建了一个定义自定义TidContext
后代并将字段添加到该类。
然后,您只需将服务器类上的ContextClass
属性设置为自定义上下文的类型即可。这样,每个连接/线程将获得其自己的包含其自己的私有字段的自定义上下文,这样对并发线程访问相同字段没有任何问题。
如果您有不同上下文需要访问的对象列表,则有两个选项。
1)创建对象的副本并将它们存储在每个上下文实例的私有字段中
这可以在OnConnect
事件中完成。
2)使用同步器保护对象免受并发线程访问,例如TIdCriticalSection
,TMultiReadExclusiveWriteSynchronizer
或信号量,
您使用哪种方法取决于每种情况。
如果你需要操作任何vcl组件,请记住这不能安全地在主vcl线程之外完成,因此你应该为此创建自己的tidnotify
后代。使用tidsynch
执行此类操作可能会导致在tidtcpserver
处于vclsynch操作过程中停止时出现死锁。
这只是我在使用Indy几年的过程中学到的一些东西。
答案 1 :(得分:2)
TIdTCPServer
是一个多线程组件。无论你将它包装在什么内容中,OnExecute
事件将始终在工作线程的上下文中触发,每个连接的客户端都有一个,因此放在处理程序中的任何代码都必须是线程安全的。 TMaster
类的成员需要同时保护多个线程并发访问。