C ++的用户模式同步库[关闭]
Posted
技术标签:
【中文标题】C ++的用户模式同步库[关闭]【英文标题】:User-mode synchronization library for C++ [closed] 【发布时间】:2009-11-27 15:30:57 【问题描述】:有谁知道 C++ 的 Windows 用户模式线程同步库(利用自旋锁/原子操作)?我只需要互斥体(~关键部分),但条件变量会更好。
【问题讨论】:
也许不是您想要的,但我建议您根据这本书同步:C++ 中的多线程编程/Mark Walmsley。它为每一章构建了一个完整的 OOP 同步库。您可以替换基本原语并进行内核或用户模式同步。对于并发,我发现大多数问题都来自对概念的理解不足。 谢谢,但我现在真的没有时间阅读整本书。我已经尝试过 Boost 和 Win32 同步原语,但我认为我的程序可以在没有上下文切换开销的情况下运行得更快。 【参考方案1】:你赢了 32 个:http://msdn.microsoft.com/en-us/library/ms682530%28VS.85%29.aspx。使用这个库here同步你有完整的解释。
【讨论】:
Win32 临界区不是用户模式结构,是吗? 它们是用户模式,仅用于无竞争的锁。当您获得高度竞争的锁时,您将切换到内核模式。【参考方案2】:正如 Patrice 所说,您可以将 win32 库用于用户模式(关键部分包含一个将旋转的旋转计数)。
Visual Studio 2010 Beta2 / Win7 x64 包含基于用户模式调度线程构建的并发运行时 (ConcRT),它允许ConcRT 检测内核阻塞并在用户模式下切换到另一个任务(比典型上下文的开销更低交换)。因此,例如,如果您在 ConcRT 中的任务上使用 boost::thread 及其条件变量和互斥锁,这些将在用户模式下处理。
您还可以使用英特尔的线程构建块,其中包含一些用户模式自旋锁。没有条件变量。
如果您真的想构建自己的自旋锁,Anthony Williams 在他的网站上有一个 std::thread for sale 的实现,其中包括来自 C++0x 的原子库。
一般来说,除非您正在执行非常细粒度的同步以保证不会有很多争用,否则我鼓励您谨慎使用自旋锁,它们往往会“自旋”,因此消耗系统cpu资源...
-瑞克
【讨论】:
【参考方案3】:感谢您的回答。事实证明,将我对线程库大小的期望建立在 boost 上是一个坏主意,并且基于 InterlockedExchange 编写自己的同步代码非常简单。我的自旋锁代码的性能比 Win32 关键部分高出大约 20%(我的意思是真正的应用程序性能,而不是综合测试):)
【讨论】:
我不确定我是否会将任何重要的同步代码称为“非常简单” - 同步往往非常困难。 那句话有点断章取义,不是吗?锁定一个互斥体就像while (InterlockedExchange(&x, 1));
一样简单,解锁是x=0;
。
在一般情况下,锁定互斥锁并不是那么简单,但我同意它可以。这种简单的方法可能会导致饥饿和优先级反转 - 但是,如果您的所有线程都以相同的优先级运行并且互斥锁的争用较低,那么这些问题可能不必担心。
是的,这就是我的情况。由于此类互斥体在资源方面非常便宜,因此我尽可能对共享资源进行分区并单独锁定每个分区 - 这样,这些实际上就没有争用了。
请注意阅读本文的人:即使是几乎从不竞争的锁也非常昂贵。执行完全并行处理,然后合并结果(例如使用延迟重复检测)可能会快得多。以上是关于C ++的用户模式同步库[关闭]的主要内容,如果未能解决你的问题,请参考以下文章