让线程进入睡眠状态(c pthreads)

时间:2012-06-19 18:06:39

标签: c multithreading pthreads

我正在使用pthreads并尝试让线程休眠X秒。

我已尝试sleep()nanosleep()pthread_cond_timedwait()(等待假的互斥锁X秒),pthread_yield(),每次线程唤醒时检查时间,看看它是否是时间运行,最后只是忙着等待X秒。

问题在于,尽管考虑到结果所有这些方法都能正常工作,但它们并没有给出我期望的性能结果。性能以吞吐量(每秒回复)而非及时来衡量。

在我的配置中,我在2个模拟物理内核(运行Ubuntu Server的VirtualBox)上运行3个软件线程。我希望在将3个线程中的1个线程置于休眠状态时获得更好的性能,因为其他2个线程有一个专用的物理核心可以运行。但是,我得到完全相反的行为(使用我所有的方法):增加睡眠时间会带来更差的表现。 (请注意, sleep 线程的工作负载为130-300ms。)

可能是因为虚拟化(主机有4个核心)?可能是因为我使用的方法与我使用pthread_yield的方法的方式类似吗?

sleep()nanosleep()如何实施?他们使用信号吗?您认为使用信号处理程序和alarm()的实现是更好的方法吗?当我致电pthread_cond_wait()时会发生什么?它是如何实现的?

我也尝试使用chrt更改调度策略,但没有运气。

2 个答案:

答案 0 :(得分:2)

我同意@Aaron Digulla的说法,你永远不会通过命中试验和猜测得到性能问题的答案。   但更重要的是,我不确定你是在衡量正确的事情,至少要按照你的说法延长你的周期线程之间的睡眠时间,更糟糕的是你的吞吐量。按照这个逻辑,你可以将睡眠周期设置为无限数量(基本上大于你的测量周期),你的吞吐量应该是最差的。是这样的吗?

请注意,测量服务器吞吐量可能是一项棘手的业务,会受到测量和客户端设置中的许多陷阱的影响。以下是合成基准数字欺骗的简单示例:http://www.teamquest.com/pdfs/whitepaper/load-test.pdf

如果您对性能测量感兴趣,请阅读该文章。这是纯金。

答案 1 :(得分:1)

  1. 通过分析器运行代码以查看花费的时间。否则,你只是猜测,根据我的经验,这些猜测在90%的时间都是错误的。

  2. alarm()可以提供帮助,但实际应该做sleep()所做的事情,所以我真的不希望出现差异。

  3. 以下是一些可能导致此问题的想法:

    • 缓存刷新。如果你的两个工作线程很好地使用缓存,那么切换到新线程可能意味着缓存刷新,这可能非常昂贵。这里的想法是,如果睡眠者将它们单独留下更长的时间,工作线程可以填充更多缓存。

    • 这两个工作线程需要一个睡眠者/锁定的资源。

    • 您衡量表现的程度如何?也许你测量了一些其他效果(桌面搜索索引你的计算机,无论如何)

    要了解这一点,你必须按功能减少代码功能,直到所需的行为开始出现+在分析器中运行它以检查意外情况。

相关问题