那里有更快的那种TMultiReadExclusiveWriteSynchronizer吗?FastCode也许吧?
从Windows Vista开始,Microsoft添加了Slim Reader/Writer锁.它的性能比Delphi 好得多TMultiReadExclusiveWriteSynchronizer.不幸的是,它只存在于Windows Vista及更高版本中,这是很少有客户真正拥有的东西.
据推测,Slim Reader/Writer lock在本机中使用的概念可以在本机Delphi代码中重做 - 但有人做过吗?
我有一种情况,即获取和释放锁定TMultiReadExclusiveWriteSynchronizer(即使没有争用 - 单个线程),导致100%的开销(操作时间加倍).我可以在没有锁定的情况下运行,但是我的类不再是线程安全的.
有更快的TMultiReadExclusiveWriteSynchronizer吗?
注意:如果我使用TCriticalSectioni,只会遭受2%的性能损失(尽管已知关键部分在获取成功时很快,即它是单线程并且没有争用).CS的缺点是我失去了" 多个读者 "的能力.
使用TMultiReadExclusiveWriteSynchronizer相当长的时间在内部BeginRead和EndRead:

然后移植代码以使用Window自己的SlimReaderWriter Lock(其中一些代码重写,因为它不支持递归锁定),并分析了resutls:
TMultiReadExclusiveWriteSynchronizer:每次迭代
10,698 ns 10,697,772,613 ns,迭代1,000,000次
SRWLock:每次迭代
8,802 ns,8,801,678,339 ns,迭代1,000,000次
Omni Reader-Writer lock:每次迭代8,941 ns,
8,940,552,487 ns,迭代1,000,000次
使用SRWLocks(又名Omni的旋转锁)时,性能提高了17%.
现在,我不能永久地切换代码以使用Windows Vista SRWLocks,因为有些客户仍然在Windows XP上.
Slim锁只是小心使用InterlockedCompareExchange功能; 但比我能成功使用更加小心.我 …
delphi multithreading critical-section readerwriterlock readerwriterlockslim
我发现了单个生产者 - 单个消费者的几个实现,但是没有针对多个生产者 - 单个消费者的实现.
Delphi是否存在"多个生产者 - 单个消费者"的无锁队列?
我正在尝试在多线程场景中实现以下代码:
Get shared access to mutex
Read data structure
If necessary:
Get exclusive access to mutex
Update data structure
Release exclusive lock
Release shared lock
Run Code Online (Sandbox Code Playgroud)
Boost线程有一个shared_mutex专为多读者单作者模型设计的类.关于这个类,有几个stackoverflow问题.但是,我不确定它适合任何读者可能成为作家的情况.文件说明:
UpgradeLockable概念是SharedLockable概念的改进,允许可升级的所有权以及共享所有权和独占所有权.这是SharedLockable概念提供的多读取器/单写模型的扩展:单个 线程可以在其他人拥有共享所有权的同时具有可升级的所有权.
从单词"single"我怀疑只有一个线程可以持有可升级的锁.其他人只持有共享锁,无法升级到独占锁.
你知道boost::shared_lock在这种情况下是否有用(任何读者都可能成为作家),或者是否还有其他方法可以实现这一目标?