c++ - 为什么多线程更慢?

标签 c++ c multithreading

所以我正在尝试编写一个查找素数的程序。该项目的真正目的只是学习多线程。首先,我编写了一个单线程程序,它在 1 分钟内找到了 13,633,943 个。我的多线程版本只有 10,025,627。

这是我的单线程程序代码

#include <iostream>

using namespace std;

bool isprime(long num)
{
    long lim = num/2;
    if(num == 1)
    {
        return 0;
    }
    for(long i = 2; i <= lim; i++)
    {
        if (num % i == 0)
        {
            return 0;
        }
        else{ lim = num/i; }
    }
    return 1;
}

int main()
{
    long lim;
    cout << "How many numbers should I test: ";
    cin >> lim;
    for(long i = 1; i <= lim || lim == 0; i++)
    {
        if(isprime(i))
        {
            cout << i << endl;
        }
    }
}

这是我的多线程程序代码。

extern"C"
{
    #include <pthread.h>
    #include <unistd.h>
}
#include <iostream>

using namespace std;

bool isprime(long num);
void * iter1(void * arg);
void * iter2(void * arg);
void * iter3(void * arg);
void * iter4(void * arg);


int main()
{
    //long lim;
    //cout << "How many numbers should I test: ";
    //cin >> lim;
    pthread_t t1;
    char mem1[4096];//To avoid false sharing. Needed anywhere else?
    pthread_t t2;
    char mem2[4096];//These helped but did not solve problem.
    pthread_t t3;
    pthread_create(&t1, NULL, iter1, NULL);
    pthread_create(&t2, NULL, iter2, NULL);
    pthread_create(&t3, NULL, iter3, NULL);
    iter4(0);
}

bool isprime(long num)
{
    long lim = num/2;
    if(num == 1)
    {
        return 0;
    }
    for(long i = 2; i <= lim; i++)
    {
        if (num % i == 0)
        {
            return 0;
        }
        else{ lim = num/i; }
    }
    return 1;
}

void * iter1(void * arg)
{
    for(long i = 1;; i = i + 4)
    {
        if(isprime(i))
        {
            cout << i << endl;
        }
    }
return 0;
}

void * iter2(void * arg)
{
    for(long i = 2;; i = i + 4)
    {
        if(isprime(i))
        {
            cout << i << endl;
        }
    }
return 0;
}

void * iter3(void * arg)
{
    for(long i = 3;; i = i + 4)
    {
        if(isprime(i))
        {
            cout << i << endl;
        }
    }
return 0;
}

void * iter4(void * arg)
{
    for(long i = 4;; i = i + 4)
    {
        if(isprime(i))
        {
            cout << i << endl;
        }
    }
return 0;
}

让我特别困惑的是系统监视器报告单线程的 CPU 使用率为 25%,多线程的使用率为 100%。这不应该意味着它的计算量是原来的 4 倍吗?

最佳答案

我很确定 cout充当共享资源 - 即使它实际上以正确的顺序正确打印每个数字,这样做也会大大减慢速度。

我做过类似的事情(它更灵活,并且使用原子操作来“选择下一个数字”),并且在我的四核机器上几乎快 4 倍。但这只是在我不打印任何东西的情况下。如果它打印到控制台,它会慢很多 - 因为很多时间都用于洗牌像素而不是实际计算。

注释掉 cout << i << endl;行,它会运行得更快。

编辑:使用我的测试程序,打印:

Single thread: 15.04s. 
Four threads: 11.25s

不打印:

Single threads: 12.63s.
Four threads: 3.69s.

3.69 * 4 = 14.76s,但 time我的 Linux 机器上的命令显示 12.792 秒的总运行时间,所以显然有一点时间所有线程都没有运行 - 或者一些会计错误......

关于c++ - 为什么多线程更慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16964563/

相关文章:

c++ - 初始化结构体中的数组变量

c - 为什么我会收到无效的初始化程序错误?

C++类成员函数转c函数

c - 如何在父子之间传递字符串?

c++ - 为什么这个 C++ 程序可以在 MacOS 上编译,但不能在 Ubuntu 上编译?

c++ - 在 C++ 中初始化结构中的 const 数组

c++ - long long 的二进制表示

c# - 远程对象上的 DynamicInvoke 是否异步工作?

java - 了解执行器服务何时完成所有提交的任务的最佳方法是什么

c - fork 和 exec 与锁定共享内存相关 - C