C++ 是否有用于C++;?

C++ 是否有用于C++;?,c++,multithreading,graph,thread-safety,C++,Multithreading,Graph,Thread Safety,基本上,我正在寻找一个图形库,它在图形操作周围具有细粒度的锁定,这样,接触图形不同部分的不同线程可以同时更改图形,并且可以阻止相互竞争的修改 我在谷歌上搜索了一下,什么也找不到。也许这对我的需求来说太具体了,但我可以想象,会有大量的科学应用程序在大型图形上工作。假设你问的是作为数学实体的图形(例如,由计算机处理的图形),那么我想你不会找到你想要的,至少在通用图书馆 问题是“线程安全”并不是所有上下文中都定义得很好的术语——至少它可能意味着您的程序在多线程并发处理时不会爆炸——但超出了这一要求,甚

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


我在谷歌上搜索了一下,什么也找不到。也许这对我的需求来说太具体了,但我可以想象,会有大量的科学应用程序在大型图形上工作。

假设你问的是作为数学实体的图形(例如,由计算机处理的图形),那么我想你不会找到你想要的,至少在通用图书馆

问题是“线程安全”并不是所有上下文中都定义得很好的术语——至少它可能意味着您的程序在多线程并发处理时不会爆炸——但超出了这一要求,甚至像容器或算法这样声称是“线程安全”的东西对于这意味着什么,将有一些额外的语义——通用图形库甚至更复杂,需要更精确(和可配置)的语义来满足这一点

例如(这里指的是一个简单的对象,比如一个容器):

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

虽然您可以为简单容器定义合理的语义(如并发集),但即使您移动到map之类的对象,您也需要引入“putIfAbsent”之类的复合操作为了弥补许多应用程序需要的不仅仅是线程安全这一事实,它们需要将通常在单独调用(搜索,然后添加)中执行的操作链接到逻辑原子操作中

我怀疑有了图形库之类的东西,这个问题会变得很严重。您的应用程序将需要定义哪些操作可以并行进行-哪些操作应该阻止其他操作,您是否需要能够获取图形的一致快照,您是否需要图形上操作的完全序列化,或者放松的模型是否合适,等等

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

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

另一方面,假设客户端可以在外部向容器添加线程安全性(无法访问内部)一个有效的方法通常是不正确的,这是在并发包中由组上线程安全容器构建的基础。但是,我怀疑您在C++中会找到一个等价的图形操作。
更新:根据其他回复,我想我应该强调的是,我不认为您会发现单线程库的通用线程安全扩展-但显然有几个显式并行线程库,尽管我怀疑这些库实现了更高级别的语义,并在内部执行并行,而不是在o线程安全的单独图形操作。

您可能想看看(可能还有)。我自己也没有使用过这两种操作,只是在将并行性作为加速某些代码的选项时偶然发现了它们。(啊……看起来并行BGL现在正式上市了!这是一个不错的概念,但与您的想法相比,他们的“分布式图”的概念可能是相当粗粒度的).

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

这里的“图形”是计算机科学抽象的东西,或者是“绘图”的另一个词?@Yacoby:是的,我知道。但是这个标签也包括了一些问题,比如和哪些有关。O海报的意思是什么?考虑到文章其余部分的上下文,我怀疑这里的图是一个数学定义。我假设它是关于一个顶点或节点意义上的图,好像你改变了一个函数的图,你需要重新绘制想要改变图形部分的整个图形是可以理解的。感谢链接。并行BGL看起来非常好,但似乎更适合在没有共享内存的情况下跨多个处理器进行并行计算。在我的情况下,我认为这太过分了。至于MTGL,它看起来相当未完成。他们一直提到它他们必须稳定他们的“基本API”!但我会密切关注它。我明白你的意思。也许将图形显式划分为多个部分,并将每个线程字放在单个部分上会更容易。然后,唯一需要的锁定是当操作涉及到图形上的边或顶点时