相关疑难解决方法(0)

更快的TMultiReadExclusiveWriteSynchronizer?

那里有更快的那种TMultiReadExclusiveWriteSynchronizer吗?FastCode也许吧?

从Windows Vista开始,Microsoft添加了Slim Reader/Writer锁.它的性能比Delphi 好得多TMultiReadExclusiveWriteSynchronizer.不幸的是,它只存在于Windows Vista及更高版本中,这是很少有客户真正拥有的东西.

据推测,Slim Reader/Writer lock在本机中使用的概念可以在本机Delphi代码中重做 - 但有人做过吗?

我有一种情况,即获取和释放锁定TMultiReadExclusiveWriteSynchronizer(即使没有争用 - 单个线程),导致100%的开销(操作时间加倍).我可以在没有锁定的情况下运行,但是我的类不再是线程安全的.

有更快的TMultiReadExclusiveWriteSynchronizer吗?

注意:如果我使用TCriticalSectioni,只会遭受2%的性能损失(尽管已知关键部分在获取成功时很快,即它是单线程并且没有争用).CS的缺点是我失去了" 多个读者 "的能力.

测量

使用TMultiReadExclusiveWriteSynchronizer相当长的时间在内部BeginReadEndRead:

在此输入图像描述

然后移植代码以使用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

22
推荐指数
1
解决办法
3842
查看次数

Delphi是否存在无锁队列"多个生产者 - 单个消费者"?

我发现了单个生产者 - 单个消费者的几个实现,但是没有针对多个生产者 - 单个消费者的实现.

Delphi是否存在"多个生产者 - 单个消费者"的无锁队列?

delphi lock-free data-structures

12
推荐指数
1
解决办法
3924
查看次数

Boost中的多个读者,单个写入器锁

我正在尝试在多线程场景中实现以下代码:

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在这种情况下是否有用(任何读者都可能成为作家),或者是否还有其他方法可以实现这一目标?

c++ multithreading boost mutex

12
推荐指数
2
解决办法
1万
查看次数