我有两个线程,它们运行得非常快,我使用pthread_mutex_lock和pthread_mutex_unlock来访问全局(外部变量)数据
问题是我的应用程序需要大约15-20%的CPU在Ubuntu Linux上运行,
相同的代码,但使用EnterCriticalSection和LeaveCriticalSection并在Windows上运行使用1-2%的CPU
答案 0 :(得分:7)
实际上这可能是好事 - 花在等待上的时间更少,更多时间处理数据。
CPU百分比计算在不同的OS上非常不同。尝试衡量吞吐量 - 您可以在一个单位时间内处理多少“工作项”。
减少锁争用的一种可能途径(如果这确实是您的问题)是使用队列连接生产者和消费者线程。将新项目链接到队列尾部很快,对于从队列头部取消链接是相同的 - 一对指针操作。 STL甚至还有一堆你可以使用的容器(std::deque
,std::queue
,std::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!