为什么在pthread-win32中主线程比工作线程慢
Why main thread is slower than worker thread in pthread-win32?
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的运行时间大一些),然后再次运行。
- C++为线程工作动态地分割例程
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- 餐饮哲学家问题 - 只有 2 个线程工作
- 工作线程在执行太快后永久休眠
- 唤醒多个线程以在每个条件下工作一次
- Qt::D irectConnection在多线程环境中使用时如何工作?
- ZeroMQ 在使用 std::thread 创建工作线程时崩溃
- 工作线程一直在等待,condition_variable甚至调用了notify_all
- 使用 std::atomic 标志和 std::condition_variable 在工作线程上等待
- SIGABRT 和线程相关的异常,但在调试期间工作正常
- c++线程的安全性和时间效率:为什么有互斥检查的线程有时比没有它的线程工作得更快
- 在多线程工作负载上解释Gperftools的结果
- 我的线程工作不好,它给出了所有结果,最后没有一个接一个,GUI 在线程运行期间挂起?
- BOOST::线程工作线程同步,C++和OpenCV
- 线程工作不正常
- 提升线程工作线程对象在线程完成后的重用
- 线程问题,其中一个线程工作,但导致调用方法不返回
- 线程工作目录
- MFC主UI线程工作和模态对话框
- 用类对象提升线程工作器