我已经阅读了之前发布的问题,该问题似乎与我在使用等待多个对象时遇到的错误相同,但我相信我的错误是不同的。我使用多个线程来计算mandelbrot集合的不同部分。程序编译并产生正确结果的次数约为5次中的3次,但有时我会得到一个错误,即“写入时出现访问冲突... (每次都有不同的内存位置)”。就像我说的,它有时有效,有时不起作用,我在等待公式对象的前后设置了断点,并得出结论,那一定是罪魁祸首。我就是不知道为什么。这是代码。
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))中。我猜竞争条件正在生效,每个线程都认为它应该添加更多的行,即使它不是必要的。谢谢你的帮助。
发布于 2011-10-10 23:24:26
我解决了这个问题。我编辑了问题并说明了哪里出了问题,但我将在这里再做一次。当我试图将复数向量推送到线程函数中的2D向量时,我遇到了竞争条件。这是由while循环控制的,当执行每个线程时,每个线程都认为它需要将更多的向量推送到称为counts的2D向量。我将这个循环移到构造函数中,并在创建时简单地将所有必要的向量推送到counts上。谢谢你帮我从一个不同的方向看问题!
https://stackoverflow.com/questions/7707028
复制相似问题