gpt4 book ai didi

c++ - c++ Qt多线程应用程序中删除指针导致崩溃

转载 作者:行者123 更新时间:2023-11-30 02:43:05 25 4
gpt4 key购买 nike

我有一个多线程应用程序,它使用线程池,所以有 10 个线程运行相同的 run() 函数,如下所示:

run(){
...
SetTileAt(p, tile);
...
ClearPointsNotIn(list);
...
}

void TileMatrix::ClearPointsNotIn(QList<Point>list)
{
removals.clear();
mutex.lock();
foreach(Point p, matrix.keys())
{
if(!list.contains(p))
{
removals.append(p);
}
}
mutex.unlock();
foreach(Point p,removals)
{
Tile* t=TileAt(p);
if(t!=0)
{
mutex.lock();
delete t;
t=0;
matrix.remove(p);
mutex.unlock();
}

}
removals.clear();
}

void TileMatrix::SetTileAt(const Point &p, Tile* tile)
{
mutex.lock();
Tile* t=matrix.value(p,0);
if(t!=0)
delete t;
matrix.insert(p,tile);
mutex.unlock();
}

Tile* TileMatrix::TileAt(const Point &p)
{
Tile* ret;
mutex.lock();
ret=matrix.value(p,0);
mutex.unlock();
return ret;
}

当我运行该应用程序时,它有时会在删除 t 部分崩溃,我当时检查了 t 的值似乎 t!=0,但指向的内容完全是垃圾。我天真地猜测这是一个“删除已删除的指针问题”。但我不太确定这是怎么发生的,我该如何修改代码来防止它发生?请注意,TileAt 中的互斥锁与 ClearPointsNotIn() 中的互斥锁可能会造成死锁...

最佳答案

这是可能发生的事情,而且似乎时常发生:

很有可能就在您在 TileMatrix::ClearPointsNotIn 中获得指针 t 之后,另一个线程锁定在 mutex.lock(); TileMatrix::SetTileAt 函数中。在那一刻,matrix.value(p,0); 可以返回与控制 TileMatrix::的线程中返回的 TileAt(p); 完全相同的指针: ClearPointsNotIn 之前。然后在 TileMatrix::SetTileAt 中删除 t 并解锁。与此同时,在运行 TileMatrix::ClearPointsNotIn 函数的线程中,您在 t 中有一个已删除的指针(因为您在另一个线程中删除了它),当您调用 delete 应用程序崩溃。

这叫做 race condition .

我建议做的是将 TileMatrix::ClearPointsNotIn 中的 mutex.lock() 语句移动到 foreach 之后和 之前Tile* t=TileAt(p);。我还建议您在删除指针后,还为其分配 0NULL。这样您的 if(t!=0) 将阻止执行线程执行 if 中的 block ,如果指针设置为 0NULL 之前。阅读herehere了解更多详情。

如果不够清楚,请告诉我,我可以提供更多详细信息。

关于c++ - c++ Qt多线程应用程序中删除指针导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26513651/

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