Я уже некоторое время работаю с деревьями BSP и также играю с потоками. При добавлении треугольника в дерево BSP появляется возможность создать новый поток для параллельной обработки данных.
insert(triangle, bspnode)
{
....
else if(triangle spans bspnode)
{
(frontpiece, backpiece) = plane_split(triangle, bspnode)
insert(frontpiece, bspnode.front)
insert(backpiece, bspnode.back)
}
....
}
Две вышеописанные операции вставки могут выполняться двумя потоками, и, поскольку они не изменяют одни и те же данные, можно использовать дешевую синхронизацию.
insert(triangle, bspnode)
{
....
else if(triangle spans bspnode)
{
(frontpiece, backpiece) = split(triangle, bspnode)
handle = beginthread(insert(backpiece, bspnode.front))
insert(frontpiece, bspnode.back)
if(handle)
{
waitforthread(handle)
}
else
{
insert(backpiece, bspnode.front)
}
}
....
}
Этот новый метод пытается создать поток для параллельного завершения операции, но не должен завершиться ошибкой, если поток не может быть создан (он просто вернется к исходному алгоритму).
Это правильная практика программирования, или я неправильно использую потоки? Я не смог найти никакой литературы по этой технике. Мне нравится, что он имеет тенденцию использовать мой процессор на полную мощность (2 ядра) и теоретически масштабируется до любого числа доступных процессоров. Мне не нравится, что это может быть ужасно расточительно для процессора и памяти.