gpt4 book ai didi

multithreading - Delphi (Indy) 线程安全类

转载 作者:行者123 更新时间:2023-12-03 19:10:16 24 4
gpt4 key购买 nike

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

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

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

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

谢谢,
阿德里安!

最佳答案

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

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

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

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

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

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

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

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

关于multithreading - Delphi (Indy) 线程安全类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11642284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com