gpt4 book ai didi

c++ - 为什么 6-7 个线程比 20 个线程快?

转载 作者:搜寻专家 更新时间:2023-10-31 00:12:29 25 4
gpt4 key购买 nike

在学校里,我们学习了 C++11 线程。老师给了我们一个简单的评估,就是用20个线程做一个基本的网络爬虫。对我来说,线程是很新的东西,尽管我确实了解基础知识。

我想提一下,我不是在找人来完成我的评估,因为它已经完成了。我只想了解为什么使用 6 个线程总是比使用 20 个线程快。

请参阅下面的代码示例。

主要.cpp:

do
{
for (size_t i = 0; i < THREAD_COUNT; i++)
{
threads[i] = std::thread(SweepUrlList);
}

for (size_t i = 0; i < THREAD_COUNT; i++)
{
threads[i].join();
}

std::cout << std::endl;
WriteToConsole();
listUrl = listNewUrl;
listNewUrl.clear();
} while (listUrl.size() != 0);

基本上,这会为每个工作线程分配要完成的作业,这是可以在下面找到的方法 SweepUrlList,然后加入所有线程。

while (1)
{
mutextGetNextUrl.lock();
std::set<std::string>::iterator it = listUrl.begin();
if (it == listUrl.end())
{
mutextGetNextUrl.unlock();
break;
}
std::string url(*it);
listUrl.erase(*it);
mutextGetNextUrl.unlock();
ExtractEmail(url, listEmail);
std::cout << ".";
}

所以每个工作线程循环直到ListUrl为空。 ExtractEmail 是一种下载网页(使用 curl)并解析它以从 mailto 链接中提取电子邮件的方法。ExtractEmail 中唯一的阻塞调用如下所示:

if(email.length() != 0)
{
mutextInsertNewEmail.lock();
ListEmail.insert(email);
mutextInsertNewEmail.unlock();
}

欢迎所有的回答,如果可能的话,链接到您找到的任何文档来回答这个问题。

最佳答案

这是线程的一个相当普遍的问题,其核心是:

你演示的是线程 Scheduling .操作系统将与各种线程一起工作,并在当前没有工作的地方安排工作。

假设您有 4 个内核和超线程,您有 8 个处理器可以承载负载,但也可以承载其他应用程序(操作系统、C++ 调试器和您要启动的应用程序)的负载。

理论上,在大约 8 个密集线程之前,您的性能可能还不错。在达到处理器可以有效使用的最多线程数后,线程开始相互竞争资源。性能不佳可以看出这一点(尤其是在密集型应用程序和紧密循环的情况下)。

最后,这是一个简化的答案,但我怀疑你看到的是什么。

关于c++ - 为什么 6-7 个线程比 20 个线程快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29989768/

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