【发布时间】:2012-06-21 20:01:09
【问题描述】:
我正在使用 pthreads 并试图让线程休眠 X 秒。
我试过sleep(),nanosleep(),pthread_cond_timedwait()(等待一个假的互斥锁X秒),pthread_yield(),每次线程唤醒时检查时间,看看是否该运行,最后只是忙着等待 X 秒。
问题在于,尽管考虑到结果,所有这些方法都可以正常工作,但它们并没有给出我期望的性能结果。性能以吞吐量(每秒回复)而不是时间来衡量。
在我的配置中,我在 2 个模拟物理内核(运行 Ubuntu Server 的 VirtualBox)上运行 3 个软件线程。我希望在将 3 个线程中的 1 个置于睡眠状态时获得更好的性能,因为其他 2 个线程有一个专用的 physical 核心可以在其上运行。然而,我得到了完全相反的行为(我所有的方法):增加睡眠时间会降低性能。 (注意 sleeping 线程的工作负载是 130-300ms。)
可能是因为虚拟化(主机有 4 个核心)?可能是因为我使用的方法与我使用 pthread_yield 的方法类似吗?
sleep() 和 nanosleep() 是如何实现的?他们使用信号吗?您认为使用信号处理程序和alarm() 的实现会是更好的方法吗?当我拨打pthread_cond_wait() 时会发生什么?它是如何实现的?
我也尝试使用chrt 更改调度策略,但没有成功。
【问题讨论】:
-
为什么不使用互斥体或信号量?让线程只在需要的时候休眠
-
您能否提供示例代码以及实际性能数据(例如,来自
time命令)来证明您的问题? -
您的线程执行了多少工作?你睡多久?多常?不要忘记上下文切换会占用宝贵的 CPU 周期。
-
@Jarry 我将如何将互斥锁或信号量保持 X 秒?你能举个例子说明你的想法吗?
-
抱歉,您从未在问题中定义“性能”和“结果”的含义。在您定义要衡量的确切数量以确定性能之前,对于“我如何提高性能”没有真正的答案。
标签: c multithreading pthreads