我正在使用 pthreads
并尝试让一个线程睡眠 X 秒。
我已经尝试过 sleep()
, nanosleep()
, pthread_cond_timedwait()
(在一个虚假的互斥锁上等待 X 秒),pthread_yield()
,每次线程唤醒时检查时间,以查看是否该运行,最后只是忙等待 X 秒。
问题是,尽管所有这些方法在结果方面都很好,但它们并没有给出我所期望的性能结果。性能是以吞吐量(每秒回复数)而不是时间来衡量的。
在我的配置中,我在 2 个模拟物理核心上运行了 3 个软件线程(VirtualBox 运行 Ubuntu Server)。当我让其中的 1 个线程睡眠时,我希望能获得更好的性能,因为其他 2 个线程有一个专用的 物理 核心可以运行。然而,我得到了完全相反的结果(使用所有方法):增加睡眠时间会导致性能变差。(请注意,睡眠 线程的工作量为 130-300ms。)
这可能是由于虚拟化(主机机器有 4 个核心)吗?这可能是因为我使用的方法与使用 pthread_yield
的方法类似吗?
sleep()
和 nanosleep()
是如何实现的?它们使用信号吗?您认为使用信号处理程序和 alarm()
实现会是更好的方法吗?当我调用 pthread_cond_wait()
时会发生什么?它是如何实现的?
我还尝试使用 chrt
更改调度策略,但没有成功。
time
命令中获取),以便演示您的问题。 - Jay Sullivan