我一直在修补 BSP 树一段时间,也在玩线程。将三角形添加到 BSP 树时,就有机会创建一个新线程以并行处理数据。
插入(三角形,bspnode)
{
……
else if(三角形跨越 bspnode)
{
(frontpiece, backpiece) = plane_split(triangle, bspnode)
插入(前端,bspnode.front)
插入(背板,bspnode.back)
}
……
}
上面的两个插入操作可以由两个线程执行,并且由于它们不会修改相同的数据,因此可以使用廉价的同步。
插入(三角形,bspnode)
{
……
else if(三角形跨越 bspnode)
{
(frontpiece, backpiece) = split(triangle, bspnode)
句柄 = beginthread(插入(后件,bspnode.front))
插入(前端,bspnode.back)
如果(句柄)
{
等待线程(句柄)
}
别的
{
插入(后端,bspnode.front)
}
}
……
}
这种新方法尝试创建一个线程以并行完成操作,但如果无法创建线程也不应该失败(它将简单地恢复到原始算法)。
这是一种合理的编程习惯,还是我不正确地使用线程?我还没有找到任何关于这种技术的文献。我喜欢它倾向于充分利用我的 CPU(2 个内核),并且理论上可以扩展到任意数量的可用处理器。我不喜欢这可能会严重浪费 CPU 和内存。