1

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

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

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

我对线程真的很陌生,任何帮助都将不胜感激!

谢谢,阿德里安!

4

2 回答 2

4

我处理此问题的方法不是让事件使用的字段属于TidTCPServer 所有者,而是定义一个自定义TidContext后代并将字段添加到该类。

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

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

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

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

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

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

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

于 2012-07-25T22:11:12.120 回答
2

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

于 2012-07-25T03:57:49.200 回答