假设我有一个类TMaster,它作为一个字段包括一个TIdTCPServer。TMaster类的某些方法负责TIdTCPServer的OnExecute事件。
首先,这是线程安全和可接受的吗?其次,让我们假设我的类有许多其他私有字段(Name、Date,任何…)。OnExecute事件(它实际上是TMaster类中的一个方法)是否可以安全地写入这些变量?
我想我的意思是问,在这种情况下,私人领域是否安全?
我真的是线程的新手,任何帮助都将不胜感激!
谢谢,阿德里安!
我处理此问题的方法是不让事件使用的字段属于TidTCPServer
所有者,但定义一个自定义TidContext
子代并将字段添加到该类中。
然后,您只需将服务器类上的ContextClass
属性设置为自定义上下文的类型。通过这种方式,每个连接/线程都将获得自己的自定义上下文,其中包含自己的专用字段,这样就不会出现并发线程访问相同字段的问题。
如果您有一个需要由不同上下文访问的对象列表,那么您有两个选项。
1) 为每个上下文实例创建对象副本并将其存储在中的专用字段中这可以在OnConnect
事件中完成。
2) 使用同步器保护对象不受并发线程访问,例如TIdCriticalSection
、TMultiReadExclusiveWriteSynchronizer
或信号量
使用哪种方法取决于每种情况。
如果您需要操作任何vcl组件,请记住,这不能在主vcl线程之外安全地完成,因此您应该为此创建自己的tidnotify
偏心。如果CCD_ 9处于vclsynch操作的中间,则在停止CCD_。
这只是我在使用印地的几年中学到的一些东西。
TIdTCPServer
是一个多线程组件。无论使用什么包装,OnExecute
事件都将始终在工作线程的上下文中触发,每个连接的客户端都有一个工作线程,因此放入处理程序中的任何代码都必须是线程安全的。TMaster
类的成员需要足够的保护,以防止多个线程同时进行并发访问。