我正在编写一个需要快速Minkowski 和计算的 C++ 软件。一个基于双重的实现就足够了。
我评估了一些几何库,例如
- CGAL
- 发光二极管
- boost::geometry(没有 Minkowski sum 实现,但是有一个教程解释了如何实现它)
但我最终使用了另一个第三方库,它与以前的库相比非常快,并且使用FIST库进行三角测量。
我的代码或多或少以以下方式工作:
- 我读了我的多边形
- 我计算我需要的 Minkowski 和
- n次
- 我决定在以下计算中使用哪些多边形
- 我根据 Minkowski 和做一些事情
- 我给结果一个值
- 我将具有最佳值的结果作为最终结果
由于循环内的计算是独立于每一轮的,我并行化了循环并且一切正常。
然后我决定在每个并行轮中移动 Minkowski 和计算:
- 我读了我的多边形
- 对于 number_of_threads(=n) 次
- 我决定在以下计算中使用哪些多边形
- 我计算了这一轮中我需要的 Minkowski 和
- 我根据 Minkowski 和做一些事情
- 我给结果一个值
- 我将具有最佳值的结果作为最终结果
但是第三方库不再起作用。
我收到number_of_threads - 1
错误消息说
断言失败。
导致断言失败的文件从运行到运行,从线程到线程,但它们都是与 FIST 头文件同名的 c 文件(虽然我有第三方库的源代码,但我只有一个 . lib 和 FIST 库的头文件)
如前所述,我尝试在并行化代码之外计算我需要的所有 Minkowski 和,并使用其中的结果。这没关系。所以我几乎可以肯定问题来自 FIST。
我有两个问题:
你知道FIST库是否是线程安全的吗?
如果没有,您能否建议我一个线程安全的(C 或更好的)C++ 三角测量库来替换 FIST(可能具有相当的性能)?
编辑:
实际上,我不知道“线程安全”是否正是我想要的:我只需要一个能够同时计算许多独立三角剖分的三角剖分库。
我认为如果库没有全局变量并且它有一个没有static
变量的类
class triangulation
{
// no static variables
void execute_triangulation();
}
这可能就足够了。所以我可以使用该类的不同实例并并行运行它们的方法。