繁体   English   中英

pthread_mutex_lock和解锁

[英]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::dequestd::queuestd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM