cgal icon indicating copy to clipboard operation
cgal copied to clipboard

traversing linear cell complex is not thread-safe

Open Supranaturaler opened this issue 2 years ago • 2 comments

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.):

Supranaturaler avatar Aug 30 '22 02:08 Supranaturaler

I know, this issue is on my todo list...

gdamiand avatar Aug 30 '22 06:08 gdamiand

Thank you for your work. Waiting for this feature to be released.

Supranaturaler avatar Aug 30 '22 08:08 Supranaturaler