为什么在pthread-win32中主线程比工作线程慢

Why main thread is slower than worker thread in pthread-win32?

本文关键字:线程 工作 pthread-win32 为什么      更新时间:2023-10-16
void* worker(void*)
{
    int clk = clock();
    float val = 0;
    for(int i = 0; i != 100000000; ++i)
    {
        val += sin(i);
    }
    printf("val: %fn", val);
    printf("worker: %d msn", clock() - clk);
    return 0;
}
int main()
{
    pthread_t tid;
    pthread_create(&tid, NULL, worker, NULL);
    int clk = clock();
    float val = 0;
    for(int i = 0; i != 100000000; ++i)
    {
        val += sin(i);
    }
    printf("val: %fn", val);
    printf("main: %d msn", clock() - clk);
    pthread_join(tid, 0);
    return 0;
}

主线程和工作线程应该运行得一样快,但结果是:

   val: 0.782206
   worker: 5017 ms
   val: 0.782206
   main: 8252 ms

主线程慢得多,我不知道为什么....


问题解决了。这是编译器的问题,GCC(MinGW)在Windows上的行为很奇怪。我在Visual Studio 2012中编译代码,没有速度差异

 Main thread and the worker thread are supposed to run equally fast, but the result is:

我从未见过实时操作系统之外的线程系统提供这样的保证。对于windows线程和所有其他线程系统(我也使用posix线程,以及MacOS X上的轻量级线程,以及c#线程)在桌面系统中,我的理解是,在一个线程相对于另一个线程的速度方面没有性能保证。

一个可能的解释(推测)可能是,因为你使用的是现代四核,它可能会提高主核的时钟速率。当主要是单线程工作负载时,现代i5/i7/AMD-FX系统将一个核心的时钟速率提高到预先额定的水平,从而使库存冷却可以散热。在更多的并行工作负载上,所有核心的时钟速度都有较小的提升,同样是基于散热的预评级,当空闲时,所有核心都被调低以最大限度地减少功耗。有可能后台工作的数量主要是在单个核心上执行的,而第二个线程在第二个核心上花费的时间不足以证明切换到所有核心速度都提高的模式。

我会再次尝试4个线程和10倍的工作负载。如果您有监控CPU负载和时钟速度的工具,我会检查一下。根据这些信息,你可以推断出我是对还是错。

另一个选项可能是分析并查看工作的哪一部分正在花费时间。可能是操作系统调用占用的时间比您的工作负载多。

您还可以在另一台具有不同性能特征的机器上测试您的软件,例如稳定的时钟速度或单核。这将提供更多信息。

可能发生的情况是,工作线程的执行与main线程的执行交织在一起,因此一些工作线程的执行时间被计算在main线程的执行时间上。您可以尝试在worker的最开始放置一个sleep(10)(比worker和main的运行时间大一些),然后再次运行。