我有一个用Delphi 10 Seattle Win32编写的服务应用程序,该应用程序具有在线程中定期更新的内存中数据。
由于数据是一个复杂的结构且以块形式接收,因此更新代码将写入临时列表,当结构完成后,会将此临时列表切换为“生产”列表,该列表将由许多读取器线程读取。
我将“ switch”代码作为关键部分与各个阅读器一起使用,以使它们相互排斥。后来我意识到,作为副作用,读取器线程在它们之间也是互斥的。
我的问题是,是否可以将其他关键节类描述为读者或作家,以允许读者同时执行。
除此之外,我仅保护读取器代码,该代码收集必须发送的数据,并在离开关键部分后复制要发送的数据。我想知道是否应该使此数据收集代码相互排斥或序列化会提高性能。
谢谢。
答案 0 :(得分:6)
SysUtils中有TMultiReadExclusiveWriteSynchronizer。 (如果您喜欢用手指,可以考虑使用同一单位的TMREWSync
别名。)
请记住,它非常慢,很多时候,简单的关键部分会表现更好。
在为Windows编译时,您也可以考虑使用Slim Reader/Writer。那是Windows特有的,但是速度很快。