pthread_mutex_lock并解锁

时间:2010-07-13 13:19:07

标签: c++ mutex pthreads

我有两个线程,它们运行得非常快,我使用pthread_mutex_lock和pthread_mutex_unlock来访问全局(外部变量)数据

问题是我的应用程序需要大约15-20%的CPU在Ubuntu Linux上运行,

相同的代码,但使用EnterCriticalSection和LeaveCriticalSection并在Windows上运行使用1-2%的CPU

5 个答案:

答案 0 :(得分:7)

实际上这可能是好事 - 花在等待上的时间更少,更多时间处理数据。

CPU百分比计算在不同的OS上非常不同。尝试衡量吞吐量 - 您可以在一个单位时间内处理多少“工作项”。

减少锁争用的一种可能途径(如果这确实是您的问题)是使用队列连接生产者和消费者线程。将新项目链接到队列尾部很快,对于从队列头部取消链接是相同的 - 一对指针操作。 STL甚至还有一堆你可以使用的容器(std::dequestd::queuestd::list)。你必须提供自己的锁定。或者查看Intel Threading Building Blocks

答案 1 :(得分:1)

我无法确切地说出你的问题是什么,但让我们说“我如何让Linux版本变得更快?”。

首先,您确定在Linux上启用了优化吗?

假设是,两个程序都在做同样数量的“工作”吗?

如果是这种情况,则需要进行配置文件 - 这将直接显示CPU周期的使用位置,并使您能够优化算法/代码。

答案 2 :(得分:1)

“我正在使用来自2个线程的1000个printf测试它,linux程序将使用比Windows更多的CPU,Windows程序完成得更快...我的意思是DOUBLE更快。所以它的问题是pthread_mutex_lock / unlock,在MSDN网站上写道,entercriticalsection比mutex更快。“

您的分析不正确。 printf来电所用的时间完全淹没了锁定/解锁时间。

如果你想一想,一定是这样的。对同一目标的两个并发printf调用必须至少获取一个锁,以防止在共享目标上踩踏。所以printf必须至少与锁获取/释放一样昂贵,甚至忽略输出操作的成本。

答案 3 :(得分:0)

比CPU负载更重要的是哪个版本更能真正起作用。可能是1-2%的负载转化为较少的实际工作。测量而不是CPU负载百分比。

答案 4 :(得分:-1)

发现最快的方法,只需使用pthread rwlocks!