【问题标题】:WaitForMultipleObjects access violation when writing写入时 WaitForMultipleObjects 访问冲突
【发布时间】: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


【解决方案1】:

我解决了这个问题。我编辑了问题并说明了问题所在,但我会在这里再做一次。当我尝试将复数向量推送到我的线程函数中的二维向量时,我遇到了竞争条件。这是由 while 循环控制的,当每个线程执行时,每个线程都认为它需要将更多向量推送到称为计数的 2D 向量。我将此循环移至构造函数,并在创建时简单地将所有必要的向量推入计数。感谢您帮助我换个方向!

【讨论】:

    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2012-12-05
    • 2013-04-15
    • 1970-01-01
    相关资源
    最近更新 更多