cgal
cgal copied to clipboard
traversing linear cell complex is not thread-safe
Issue Details
traversing linear cell complex is not thread-safe
Source Code
#include <thread>
#include "CGAL/Exact_predicates_exact_constructions_kernel.h"
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point_3;
#include "CGAL/Linear_cell_complex_for_combinatorial_map.h"
typedef CGAL::Linear_cell_complex_traits<3, Kernel> LCCTraits;
typedef CGAL::Linear_cell_complex_for_combinatorial_map<3, 3, LCCTraits> LCCMesh;
#include "CGAL/Linear_cell_complex_constructors.h"
typedef CGAL::Linear_cell_complex_incremental_builder_3<LCCMesh> LCCBuilder;
int main(int argc, char* argv[])
{
int size = 20;
int xSize = size, ySize = size, zSize = size;
std::vector<double> vecX, vecY, vecZ;
for (int i = 0; i < size; ++i)
{
vecX.push_back(i);
vecY.push_back(i);
vecZ.push_back(i);
}
LCCMesh lccMesh;
LCCBuilder lccBuilder(lccMesh);
for (int i = 0; i < size; ++i)
{
for (int j = 0; j < size; ++j)
{
for (int k = 0; k < size; ++k)
{
lccBuilder.add_vertex(Point_3(vecX[i], vecY[j], vecZ[k]));
}
}
}
int startIndex = 0;
for (int i = 0; i < xSize; ++i)
{
for (int j = 0; j < ySize; ++j)
{
for (int k = 0; k < zSize; ++k)
{
if (i != xSize - 1 && j != ySize - 1 && k != zSize - 1)
{
lccBuilder.begin_surface();
int index1 = startIndex;
int index2 = startIndex + zSize;
int index3 = startIndex + ySize * zSize + zSize;
int index4 = startIndex + ySize * zSize;
int index5 = startIndex + ySize * zSize + 1;
int index6 = startIndex + 1;
int index7 = startIndex + zSize + 1;
int index8 = startIndex + ySize * zSize + zSize + 1;
lccBuilder.begin_facet();
lccBuilder.add_vertex_to_facet(index1);
lccBuilder.add_vertex_to_facet(index2);
lccBuilder.add_vertex_to_facet(index3);
lccBuilder.add_vertex_to_facet(index4);
lccBuilder.end_facet();
lccBuilder.begin_facet();
lccBuilder.add_vertex_to_facet(index5);
lccBuilder.add_vertex_to_facet(index8);
lccBuilder.add_vertex_to_facet(index7);
lccBuilder.add_vertex_to_facet(index6);
lccBuilder.end_facet();
lccBuilder.begin_facet();
lccBuilder.add_vertex_to_facet(index1);
lccBuilder.add_vertex_to_facet(index4);
lccBuilder.add_vertex_to_facet(index5);
lccBuilder.add_vertex_to_facet(index6);
lccBuilder.end_facet();
lccBuilder.begin_facet();
lccBuilder.add_vertex_to_facet(index3);
lccBuilder.add_vertex_to_facet(index2);
lccBuilder.add_vertex_to_facet(index7);
lccBuilder.add_vertex_to_facet(index8);
lccBuilder.end_facet();
lccBuilder.begin_facet();
lccBuilder.add_vertex_to_facet(index5);
lccBuilder.add_vertex_to_facet(index4);
lccBuilder.add_vertex_to_facet(index3);
lccBuilder.add_vertex_to_facet(index8);
lccBuilder.end_facet();
lccBuilder.begin_facet();
lccBuilder.add_vertex_to_facet(index1);
lccBuilder.add_vertex_to_facet(index6);
lccBuilder.add_vertex_to_facet(index7);
lccBuilder.add_vertex_to_facet(index2);
lccBuilder.end_facet();
lccBuilder.end_surface();
}
startIndex++;
}
}
}
auto traverse = [](const LCCMesh& lccMesh)
{
std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
for (LCCMesh::One_dart_per_cell_const_range<3>::const_iterator volumeIter(lccMesh.one_dart_per_cell<3>().begin()),
volumeEndIter(lccMesh.one_dart_per_cell<3>().end()); volumeIter != volumeEndIter; ++volumeIter)
{
}
};
std::vector<std::thread> workers;
for (size_t i = 0; i < 4; ++i)
{
workers.emplace_back(traverse, std::cref(lccMesh));
}
for (std::thread& worker : workers)
{
worker.join();
}
return EXIT_SUCCESS;
}
Environment
- Operating system (Windows/Mac/Linux, 32/64 bits): Windows 11 home basic 64 bits
- Compiler: MSVC-2019-Community
- Release or debug mode: debug
- Specific flags used (if any):
- CGAL version: CGAL-5.4
- Boost version: boost_1_78_0
- Other libraries versions if used (Eigen, TBB, etc.):
I know, this issue is on my todo list...
Thank you for your work. Waiting for this feature to be released.