写入时WaitForMultipleObjects访问冲突

时间:2011-10-09 22:32:09

标签: c++ multithreading visual-studio-2010 winapi access-violation

我已经阅读了之前发布的问题,这个问题似乎与我在使用等待多个对象时遇到的错误相同,但我相信我的不同。我使用几个线程来计算mandelbrot集的不同部分。该程序在5次中有3次编译并生成正确的结果,但有时我会收到一条错误,上面写着“写入时的访问冲突...(某些内存位置每次都不同)”。就像我说的,有时它有效,有时则不然。我在waitformultipleobjects之前和之后放置了断点,并得出结论,那一定是罪魁祸首。我只是不知道为什么。这是代码......

int max = size();
if (max == 0)               //Return false if there are no threads
    return false;

for(int i=0;i<max;++i)          //Resume all threads
    ResumeThread(threads[i]);

HANDLE *first = &threads[0];    //Create a pointer to the first thread
WaitForMultipleObjects(max,first,TRUE,INFINITE);//Wait for all threads to finish

更新:我尝试使用for循环和WaitForSingleObject,问题仍然存在。 更新2:这是线程函数。所有指针看起来都很难看。

unsigned MandelbrotSet::tfcn(void* obj)
{
funcArg *args = (funcArg*) obj;
int count = 0;
vector<int> dummy;

while(args->set->counts.size() <= args->row)
{
        args->set->counts.push_back(dummy);
}
for(int y = 0; y < args->set->nx; ++y)
{

    complex<double> c(args->set->zCorner.real() + (y * args->set->dx), args->set->zCorner.imag() + (args->row * args->set->dy));
    count = args->set->iterate(c);
    args->set->counts[args->row].push_back(count);
}
return 0;
}

已解决:大家好,我发现了这个问题。你是对的。这是在线程本身。问题是所有线程都试图将行添加到我的2D向量计数中(counts.push_back(dummy))。我猜竞争条件正在生效,每个线程都假设它应该添加更多行,即使没有必要。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。我编辑了这个问题,说明了什么是错的,但我会在这里再做一次。当我试图在我的线程函数中将复数向量推送到2D向量时,我遇到了竞争条件。这是由while循环控制的,当每个线程执行时,每个线程都认为它需要将更多的向量推送到称为计数的2D向量。我将此循环移动到构造函数,并在创建时将所有必要的向量推送到计数上。谢谢你帮我看一个不同的方向!

相关问题