首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >写入时WaitForMultipleObjects访问冲突

写入时WaitForMultipleObjects访问冲突
EN

Stack Overflow用户
提问于 2011-10-10 06:32:09
回答 1查看 620关注 0票数 1

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

代码语言:javascript
复制
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:这里是线程函数。它看起来有点丑陋,所有的指针。

代码语言:javascript
复制
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))中。我猜竞争条件正在生效,每个线程都认为它应该添加更多的行,即使它不是必要的。谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2011-10-10 23:24:26

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7707028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档