gpt4 book ai didi

c++ - 我究竟做错了什么? (多线程)

转载 作者:太空狗 更新时间:2023-10-29 22:53:03 25 4
gpt4 key购买 nike

简而言之,这是我正在做的事情。

在我类(class)的 cpp 文件中,我有:

std::vector<std::vector<GLdouble>> ThreadPts[4];

线程过程如下所示:

unsigned __stdcall BezierThreadProc(void *arg)
{
SHAPETHREADDATA *data = (SHAPETHREADDATA *) arg;

OGLSHAPE *obj = reinterpret_cast<OGLSHAPE*>(data->objectptr);
for(unsigned int i = data->start; i < data->end - 1; ++i)
{


obj->SetCubicBezier(
obj->Contour[data->contournum].UserPoints[i],
obj->Contour[data->contournum].UserPoints[i + 1],
data->whichVector);

}

_endthreadex( 0 );
return 0;

}

SetCubicBezier 看起来像这样:

void OGLSHAPE::SetCubicBezier(USERFPOINT &a,USERFPOINT &b, int &currentvector )
{
std::vector<GLdouble> temp;
if(a.RightHandle.x == a.UserPoint.x && a.RightHandle.y == a.UserPoint.y
&& b.LeftHandle.x == b.UserPoint.x && b.LeftHandle.y == b.UserPoint.y )
{
temp.clear();
temp.push_back((GLdouble)a.UserPoint.x);
temp.push_back((GLdouble)a.UserPoint.y);

ThreadPts[currentvector].push_back(temp);
temp.clear();
temp.push_back((GLdouble)b.UserPoint.x);
temp.push_back((GLdouble)b.UserPoint.y);


ThreadPts[currentvector].push_back(temp);

}
}

调用线程的代码如下所示:

for(int i = 0; i < Contour.size(); ++i)
{
Contour[i].DrawingPoints.clear();

if(Contour[i].UserPoints.size() < 2)
{
break;
}

HANDLE hThread[4];
SHAPETHREADDATA dat;
dat.objectptr = (void*)this;
dat.start = 0;
dat.end = floor((Contour[i].UserPoints.size() - 1) * 0.25);
dat.whichVector = 0;
dat.contournum = i;



hThread[0] = (HANDLE)_beginthreadex(NULL,0,&BezierThreadProc,&dat,0,0);

dat.start = dat.end;
dat.end = floor((Contour[i].UserPoints.size() - 1) * 0.5);
dat.whichVector = 1;

hThread[1] = (HANDLE)_beginthreadex(NULL,0,&BezierThreadProc,&dat,0,0);

dat.start = dat.end;
dat.end = floor((Contour[i].UserPoints.size() - 1) * 0.75);
dat.whichVector = 2;

hThread[2] = (HANDLE)_beginthreadex(NULL,0,&BezierThreadProc,&dat,0,0);

dat.start = dat.end;
dat.end = Contour[i].UserPoints.size();
dat.whichVector = 3;

hThread[3] = (HANDLE)_beginthreadex(NULL,0,&BezierThreadProc,&dat,0,0);

WaitForMultipleObjects(4,hThread,true,INFINITE);

这有什么问题吗?我希望它能填满 ThreadPts[4]; ... 我设置它的方式永远不应该有任何冲突。在 dat->whichvector = 3 的最后一个线程上,我通常会在...处写入错误。如果我删除:

dat.start = dat.end;
dat.end = Contour[i].UserPoints.size();
dat.whichVector = 3;

hThread[3] = (HANDLE)_beginthreadex(NULL,0,&BezierThreadProc,&dat,0,0);

然后它似乎没有崩溃,可能是哪里出了问题?

谢谢

最佳答案

问题是您将相同的 dat 结构传递给每个线程作为 threadproc 的参数。

例如,当您启动线程 1 时,无法保证它会在主线程开始加载相同的 dat 结构之前读取 dat 结构中的信息与线程 2(等等)的信息。事实上,您在整个线程循环中不断地直接使用 dat 结构,因此在线程基本上完成所有工作之前,线程不会完成传递给它的结构。

另请注意,SetCubicBezier() 中的 currentvector 是对 data->whichVector 的引用,它指的是一个线程。因此,SetCubicBezier() 将在不同的线程中对同一对象执行 push_back() 调用。

有一个非常简单的解决方法:您应该使用四个单独的 SHAPETHREADDATA 实例 - 一个来初始化每个线程。

关于c++ - 我究竟做错了什么? (多线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3190158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com