[英]pthread_mutex_lock and unlock
我有两个线程,它们运行得非常快,我正在使用pthread_mutex_lock和pthread_mutex_unlock来访问全局(扩展变量)数据
问题是我的应用程序占用了在Ubuntu Linux上运行的大约15-20%的CPU,
相同的代码,但具有EnterCriticalSection和LeaveCriticalSection并在Windows上运行使用1-2%的CPU
实际上,这可能是一件好事 -减少等待时间,花费更多时间处理数据。
在不同的OS-es上,CPU百分比计算有很大不同。 尝试测量吞吐量 -您可以在一个时间单位内处理多少个“工作项”。
减少锁争用 (如果的确是您的问题)的一种可行方法是将生产者线程和使用者线程与队列连接 。 将新项目链接到队列尾部很快,与取消链接队列头的链接相同,-几个指针操作。 STL甚至有很多可以使用的容器( std::deque
, std::queue
, std::list
)。 但是,您将必须提供自己的锁定。 或研究英特尔线程构建基块 。
我不能完全说出您的问题是什么,但是可以说是“如何使Linux版本更快?”。
首先,您确定在Linux上启用了优化功能吗?
假设是,这两个程序是否做相同数量的“工作”?
如果是这样,那么您需要进行概要分析-这将直接向您显示正在使用CPU周期的位置,并且应该使您能够优化算法/代码。
“我正在使用来自2个线程的1000个printf进行测试,Linux程序将始终比Windows程序使用更多的CPU,Windows程序完成得更快...我的意思是双倍更快。所以这是MSDN中pthread_mutex_lock / unlock的问题网站上写道,entercriticalsection比互斥锁更快。”
您的分析不正确。 在printf
调用中花费的时间完全淹没了锁定/解锁时间。
如果您考虑的话,一定是这样。 对同一目标的两个并发printf
调用必须至少获取一个锁,以防止踩踏共享目标。 因此,即使忽略输出操作的成本, printf
至少必须与锁获取/释放一样昂贵。
比CPU负载更重要的是哪个版本可以完成更多实际工作。 1-2%的负载可能会减少实际工作量。 测量该值而不是CPU负载百分比。
找到最快的方法,只需使用pthread rwlocks!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.