C ++有任何线程安全的图形库吗?

时间:2009-12-21 17:33:39

标签: c++ multithreading graph thread-safety

基本上我正在寻找一个图形库,它可以在图形操作周围进行细粒度锁定,这样触摸图形不同部分的不同线程可以同时改变它,并且可以阻止竞争修改。

我google了一下,找不到任何东西。也许这对我的需求来说太具体了,但我想可能存在大量适用于大型图表的科学应用程序。

3 个答案:

答案 0 :(得分:2)

您可能需要查看Parallel Boost Graph Library(也许是MultiThreaded Graph Library)。我还没有使用过自己,只是偶然发现它们,同时将并行性作为加速某些BGL代码的选项。 (啊......看起来Parallel-BGL现在正式in boost!有一个很好的architectural overview,但也许他们的“分布式图形”的概念与你所拥有的相比是非常粗糙的。记)。

答案 1 :(得分:1)

假设您要求将图形作为一个数学实体(例如,由GraphBase处理的图形类型) - 那么我认为您不会找到您想要的内容,至少在通用图书馆。

问题是“线程安全”在所有上下文中并不是一个定义明确的术语 - 至少它可能意味着你的程序可能不会在面对多线程的并发处理时爆炸 - 但超出这个要求,即使是像容器或算法那样声称“踏踏实实”的东西,也会有一些关于这意味着什么的额外语义 - 而且通用图形库更加复杂,需要更加精确(和可配置的语义来满足这一点。

例如(在这里谈到一个简单的对象 - 比如一个容器):

是否允许对同一对象进行并发读访问? 并发写访问是否允许同一个对象? 读者会阻止读者吗? 读者会阻止作家吗? 作家会阻止作家吗? 更一般地说,哪些操作阻止了其他操作?

虽然你可以为简单的容器定义合理的语义 - 比如一个并发集 - 即使你转移到像map这样的东西,你需要引入像“putIfAbsent”这样的复合操作来弥补许多应用程序需要的东西而不是线程-safety - 他们需要将通常在单独调用(搜索,然后添加)中执行的操作链接到逻辑原子操作中。

我怀疑像图库一样,这个问题变得非常严重。您的应用程序需要定义哪些操作可以并行进行 - 哪些操作应该阻止其他操作,是否需要能够获取图表的一致快照,是否需要图表上的操作的完全可序列化,或者是否放松模型是合适的,所以它。

我很难将所有这些通用性构建到图形库中,并且可能无法提前预测线程安全性的实际要求(以上只是可能考虑因素的一小部分),所以我怀疑大多数图形库只提供关于行为的弱保证(例如,允许并发读取访问)或根本没有明确的安全性,并期望库的使用者在顶部构建更高级别的同步结构。

另一个原因是高性能库只能在线程不安全的版本中找到,以避免惩罚不需要这种安全性的客户端(对于大多数情况,对于给定类的大多数实例而言可能是大多数) - 假设线程安全可以由需要它的人在外部添加,但通常不可能进行反向转换(消除线程安全)。 Java一直采用这种方式,一些早期线程安全类(例如Vector)的有效弃用支持ArrayList和StringBuffer vs StringBuilder。

另一方面,假设客户端可以以有效的方式向外部容器(无法访问内部)添加线程安全性通常是不正确的 - 这是构建组件线程的基础 - 并发包中的安全容器。我很怀疑你会在C ++中找到一个等效的图形操作。

更新:根据其他回复,我想我应该强调一下,我认为你不会找到单线程库的通用线程安全扩展 - 但显然有几个显式并行线程库,虽然我怀疑它们实现了更高级别的语义并在内部执行并行操作,而不是面向线程安全的单个图形操作操作。

答案 2 :(得分:1)

不幸的是,细粒度锁定的成本可能高于多线程的加速。更不用说死锁的风险,当你拥有超过极少数的互斥锁时,锁管理会变得更加困难。