mam funkcję rekurencyjną która tworzy model piramidy Sierpińskiego i chciałem przepisać ją na wątek by się szybciej wykonywała
kod funkcji:

void __cdecl creatorthread(void * args)
{
    HANDLE help;
    InStruct * in=(InStruct*)args;
    vector<HANDLE>threads;
    vector<vector<Triangle3d>>triangles;
    if (in->lvl>1)
    {
        InStruct * helpin=new InStruct[4];

        for (unsigned int i=0; i<4; i++)
        {
            triangles.push_back(vector<Triangle3d>());
            helpin[i].triangles=&triangles[i];
            helpin[i].lvl=in->lvl-1;
            helpin[i].l=in->l/2;
            switch(i)
            {
            case 0:
                {
                    helpin[i].x=in->x;
                    helpin[i].y=in->y-in->l*sqrt(3)/6;
                    helpin[i].z=in->z;
                    break;
                }
            case 1:
                {
                    helpin[i].x=in->x+in->l/4;
                    helpin[i].y=in->y+in->l*0.5*sqrt(3)/6;
                    helpin[i].z=in->z+in->l*0.5*sqrt(3)/6;
                    break;
                }
            case 2:
                {
                    helpin[i].x=in->x-in->l/4;
                    helpin[i].y=in->y+in->l*0.5*sqrt(3)/6;
                    helpin[i].z=in->z+in->l*0.5*sqrt(3)/6;
                    break;
                }
            case 3:
                {
                    helpin[i].x=in->x;
                    helpin[i].y=in->y+in->l*0.5*sqrt(3)/6;
                    helpin[i].z=in->z-in->l*sqrt(3)/6;
                    break;
                }
            }
            threads.push_back(help);
            threads[threads.size()-1]=(HANDLE)_beginthread(creatorthread,0,&helpin[i]);
        }
        WaitForMultipleObjects(threads.size(),&threads[0],TRUE,INFINITE);
        for (unsigned int i=0; i<4; i++)
        {
            for (unsigned int j=0; j<triangles[i].size(); j++)
            in->triangles->push_back(triangles[i][j]);
        }
        delete[]helpin;
        triangles.clear();

    }
    else if (in->lvl==1)
    {
        Triangle3d tri3d;

        tri3d.points[0].x=in->x;
        tri3d.points[0].y=in->y-2*in->l*sqrt(3)/6;
        tri3d.points[0].z=in->z;

        tri3d.points[1].x=in->x-in->l/2;
        tri3d.points[1].y=in->y+in->l*sqrt(3)/6;
        tri3d.points[1].z=in->z+in->l*sqrt(3)/6;

        tri3d.points[2].x=in->x+in->l/2;
        tri3d.points[2].y=in->y+in->l*sqrt(3)/6;
        tri3d.points[2].z=in->z+in->l*sqrt(3)/6;

        tri3d.points[3].x=in->x;
        tri3d.points[3].y=in->y+in->l*sqrt(3)/6;
        tri3d.points[3].z=in->z-2*in->l*sqrt(3)/6;

        in->triangles->push_back(tri3d);
    }
    _endthread();
} 

a tu są klasy

class Color
{
public:
    double r,g,b;
    Color()
    {
        r=0;
        g=0;
        b=0;
    }
    Color(const Color & target)
    {
        r=target.r;
        g=target.g;
        b=target.b;
    }
};

class Triangle3d
{
    class Point
    {
    public:
        double x,y,z;
        Point()
        {
            x=0;
            y=0;
            z=0;
        }
        Point(const Point & target)
        {
            x=target.x;
            y=target.y;
            z=target.z;
        }
    };
public:
    Point points[4];
    Triangle3d(){};
    Triangle3d(const Triangle3d& target)
    {
        points[0]=target.points[0];
        points[1]=target.points[1];
        points[2]=target.points[2];
        points[3]=target.points[3];
    }
};

struct InStruct
{
    double x,y,z,l;
    vector<Triangle3d>*triangles;
    unsigned int lvl;
    InStruct()
    {
        x=0;
        y=0;
        z=0;
        l=0;
        lvl=0;
        triangles=NULL;
    }
    InStruct(const InStruct & target)
    {
        x=target.x;
        y=target.y;
        z=target.z;
        l=target.l;
        triangles=target.triangles;
        lvl=target.lvl;
    }
    InStruct(double X,double Y,double Z,double L,vector<Triangle3d>*Triangles,unsigned int Lvl)
    {
        x=X;
        y=Y;
        z=Z;
        l=L;
        triangles=Triangles;
        lvl=Lvl;
    }
    ~InStruct()
    {
        triangles=NULL;
    }
};
 

przy poziomie 1 funkcja działa dobrze ale przy wyższych poziomach są crashe, dlaczego?