我一直在修补 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 和内存。