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

标签 c++ multithreading visual-studio-2013 windows-8.1 stdthread

在学校里,我们学习了 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/

相关文章:

c - 为什么 sqlite 告诉我 "out of memory"?

c++ - unique_ptr & vector,试图访问已删除的函数,Visual Studio 2013

c++ - #define 字符串转换为 LPCSTR 或 std::string

c++ - 指示编译时调用了什么构造函数

c++ - 线程不会在 Linux 上终止,但会在 Mac 上终止

c# - Visual Studio 未将设计器连接到代码隐藏

ssl - visual studio无情提示信任IIS Express SSL证书

c++ - 这个拷贝构造函数做的是深拷贝还是浅拷贝?

c++ - 使用 OpenCV 计算网格上的对象

c++ - 读写竞争条件会改变同时读取和写入的数据吗?