gpt4 book ai didi

c++ - 写入时 WaitForMultipleObjects 访问冲突

转载 作者:太空宇宙 更新时间:2023-11-04 14:20:58 27 4
gpt4 key购买 nike

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

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;
}

已解决:好的大家,我找到了问题所在。你是对的。它在线程本身中。问题是所有线程都试图将行添加到我的二维计数 vector (counts.push_back(dummy))。我猜竞争条件正在生效,每个线程都认为它应该添加更多行,即使在没有必要的时候也是如此。感谢您的帮助。

最佳答案

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

关于c++ - 写入时 WaitForMultipleObjects 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7707028/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com