Qt 多线程复制文件崩溃

王桑的一天 王桑的一天 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我在生产者线程中遍历文件,把文件塞入队列,消费者从队列取文件路径进行复制、或剪切行为
用了 QSemaphore 来限制队列长度,达到阻塞的目的,起了8个消费者线程

这段代码复制是没问题,剪切(rename)就会崩溃,为什么?rename 是异步的吗?

报错的故障模块是
故障模块名称: msvcrt.dll


static QSemaphore freeSpace(8);
static QSemaphore usedSpace(0);
static QQueue<MoveInfo *> task_q;
// 消费者代码
void Consumer::run()
{
MoveInfo *info;
while(true)
{
usedSpace.acquire();
info = task_q.dequeue();
freeSpace.release();
if(info->src.isEmpty())
{
info->deleteLater();
break;
}

if(!QFileInfo(info->dst).exists())
{
if(info->remove)
{
bool b = QFile::rename(info->src, info->dst);
b = QFile::rename(info->src.replace(".sa", ".sc"), info->dst.replace(".sa", ".sc"));
} else {
QFile::copy(info->src, info->dst);
QFile::copy(info->src.replace(".sa", ".sc"), info->dst.replace(".sa", ".sc"));
}
}
info->deleteLater();
}
}
...全文
评论 2
收藏 已收藏
分享
返回顶部
王桑的一天
Qt 21,503 成员 26,693 内容