【发布时间】:2011-12-04 03:44:11
【问题描述】:
我已阅读之前发布的问题,该问题似乎与我在使用 wait for multiple objects 时遇到的错误相同,但我相信我的问题不同。我正在使用多个线程来计算 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;
}
已解决:大家好,我找到了问题所在。你是对的。它在线程本身中。问题是所有线程都试图将行添加到我的二维计数向量(counts.push_back(dummy))。我猜竞态条件正在生效,每个线程都假设它应该添加更多行,即使它不是必需的。感谢您的帮助。
【问题讨论】:
-
你没有关闭,这个sn-p中没有写入。
-
我希望你不要在任何地方调用 SuspendThread。那可能会给你带来麻烦。无论如何,我认为问题出在工作线程的代码上,但你看到主线程在 WFMO 中等待,应该是这样。
-
错误可能在线程内部而不是外部
-
当我使用调试器时,它说断点在一个名为 xutility 的文件中。它在一个名为 _Container_base12::_Swap_all 的函数中
标签: c++ multithreading visual-studio-2010 winapi access-violation