drp*_*per 5 c++ multithreading graph thread-safety
基本上我正在寻找一个图形库,它可以在图形操作周围进行细粒度锁定,这样触摸图形不同部分的不同线程可以同时改变它,并且可以阻止竞争修改.
我google了一下,找不到任何东西.也许这对我的需求来说过于具体,但我想可能存在大量适用于大型图表的科学应用程序.
假设您询问的是作为数学实体的图形(例如,由GraphBase处理的图形类型) - 那么我认为您不会找到您正在寻找的东西,至少在通用库中是这样。
问题是“线程安全”并不是在所有情况下都是一个明确定义的术语 - 至少它可能意味着你的程序在面对多个线程的并发处理时可能不会爆炸 - 但超出了这个要求,即使是像容器或算法这样的声称“安全”的东西,也会有一些额外的语义来说明其确切含义——而通用图形库甚至更复杂,需要更精确(和可配置)的语义来满足这一点。
例如(这里谈到一个简单的对象 - 比如说一个容器):
是否允许对同一对象进行并发读取访问?是否允许对同一对象进行并发写访问?读者会屏蔽读者吗?读者会阻碍作者吗?作家会阻止作家吗?更一般地说,哪些操作会阻止其他操作?
尽管您可以为简单容器定义合理的语义(例如并发集),但即使您转向映射之类的内容,您也需要引入诸如“putIfAbsent”之类的复合操作,以弥补许多应用程序需要的不仅仅是线程安全的事实 -他们需要将通常在单独调用(搜索,然后添加)中执行的操作链接在一起,形成逻辑上的原子操作。
我怀疑使用像图形库这样的东西,这个问题会变得尖锐。您的应用程序需要定义哪些操作可以并行进行 - 哪些操作应该阻止其他操作,是否需要能够获取图形的一致快照,是否需要图形上操作的完全可串行性,或者是否需要宽松的模型是合适的,如此而已。
我将非常难以将所有这些通用性构建到图形库中,并且可能无法提前预测线程安全方面的实际要求(以上只是可能考虑因素的一小部分),所以我怀疑大多数图形库仅提供有关行为的弱保证(例如,允许并发读取访问)或根本不提供显式安全性,并期望库的使用者在顶部构建更高级别的同步结构。
高性能库仅在线程不安全版本中找到的另一个原因是为了避免惩罚不需要这种安全性的客户端(对于给定类的大多数实例,这可能是大多数客户端) - 假设线程安全可以由需要它的人在外部添加,但反向转换(消除线程安全)通常是不可能的。Java 一直在走这条路,实际上弃用了一些早期的线程安全类(例如 Vector),转而使用 ArrayList 和 StringBuffer,而不是 StringBuilder。
另一方面,客户端可以以有效的方式在外部向容器添加线程安全性(无法访问内部)的假设通常是不正确的——这是从组中构建线程安全容器背后的基础在并发包中。然而,我非常怀疑您是否会在 C++ 中找到等效的图形操作。
更新: 根据其他答复,我想我应该强调,我认为您不会找到单线程库的通用线程安全扩展 - 但显然有几个显式并行线程库,尽管我怀疑这些实现了更高级别语义并在内部进行并行性,而不是面向线程安全的单独图形操作操作。
| 归档时间: |
|
| 查看次数: |
1668 次 |
| 最近记录: |