gpt4 book ai didi

c++ - 使用 QueuedConnection 还是 QMutex 来使对象线程安全?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:23 25 4
gpt4 key购买 nike

我正在构建一个需要加载数千个 HTML 文件的应用程序,分析它们然后将它们放入全局的 HashMap 之类的东西中,我决定使用多线程来加快速度。

所以问题出现了,我应该使用 QueuedConnection 用于信号/槽或 QMutex 使 HashMap 线程安全。

我使用 QueueConnection 使一切变得更简单,我创建了很多子线程来加载并将指针发回主线程以分析它们并将它们放入 HashMap,然后它工作正常。

然而,当我读到一些评论说 QueueConnection 实际上非常耗时时,我开始重新构建我的代码并使用 QMutex 使我的 HashMap 线程安全,然后我可以完成所有工作(加载,分析,将它们放到子线程中的 HashMap 中。

但结果并不十分乐观,后一种方式比前一种方式消耗的时间要多得多。

QueueConnection 真的是更好的工作方式吗?

示例代码如下:

使用队列连接:

class Html
{
void create();
{
/* Load from local file */
}
void analyze()
{
/* Pick out every word and put them into the inverted list */
QString word = this->getNextWord();
/* What's stored in the hashmap is a list */
List list = HashMap::globalInstance()->getList(word);
/* Do some work like checking */
list->append(this);
}
}



class LoadHtml : public QThread
{
signals:
void processHtml(Html* ptr);
public:
void run()
{
Html* ptr = new Html();
ptr->create();
emit processHtml(ptr);
}
}

class MainThread: public QThread
{
private:
LoadHtml loadHtml;
slots:
void processHtml(Html* ptr)
{
ptr->analyze();
}
void run()
{
connect(&loadHtml,LoadHtml::processHtml,this,MainThrad::processHtml,Qt::QueuedConnection);
loadHtml.start();
}
}

而 QMutex 版本就像简单地删除信号/插槽并将 QMutex 放入 HashMapList 的所有方法中并尝试执行 analyze( )LoadHtml 中。

最佳答案

互斥量将是两者中较快的解决方案,因为在频繁访问的情况下,排队连接的开销会非常高,以至于使用多线程实际上比使用直接连接的单线程要慢得多。

但我会建议一个不同的解决方案和一个更好的解决方案。不要将作业结果直接存储在全局 HashMap 中,而是为每个作业创建一个本地 HashMap ,并使用它来存储结果,只有在作业完成后,才将本地结果合并到全局哈希中 map 。这会将排队连接或互斥锁定/解锁从每个单词一次减少到每个作业一次。这将为您提供最佳性能。这样一来,使用排队连接或互斥体之间的区别就可以忽略不计,因此您可以简单地使用更简单、更清洁的解决方案。

但是,看看您的代码示例,我会说性能不是您当前关心的问题。这是来自您的实际代码,还是只是一个非常非常糟糕的示例?这没有意义。

关于c++ - 使用 QueuedConnection 还是 QMutex 来使对象线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33459576/

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