我正在研究在Linux上运行的嵌入式C应用程序.我最近在使用pthread时遇到了一些非常奇怪的性能问题.
我的系统有8个线程来回传递信息,这些信息使用pthread互斥锁进行保护.独立运行我的应用程序时,使用互斥锁时线程性能会非常慢.在500 MHz ARM板上,锁定和解锁互斥锁约200次需要2.4秒,而在200MHz板上则需要更长的时间.
奇怪的是,当我在GDB下运行应用程序时,该应用程序运行得非常快. GDB运行时,同一代码块独立花费了2.4秒的时间,大约需要2毫秒.
我已经在2种不同的基于ARM的SBC上测试了此行为:一种运行带有gcc 3.4.4和glibc 2.3.2的Linux 2.4.26,另一种运行带有gcc 3.4.4和glibc 2.3.2的Linux 2.6.21 .
经过大量测试后,我怀疑问题出在pthreads库中,而这恰好是两块板的工具链上的相同版本.这将是不幸的,因为我的SBC供应商没有为他们的董事会提供各种各样的工具链,而且恐怕他们都会遇到这个问题.如果没有在GDB下运行,是否有人对导致性能下降的原因有任何见解?
解决方法:
ARM上的pthread从来没有问题,我怀疑您的代码中存在竞争或初始化问题.尝试将您的代码减少到可重现该问题的最少代码.
您应该在此处或您认为相关的部分发布此代码.
而且不要忘记,通常是select isn’t broken
您在使用LinuxThreads还是NPTL(“内核”线程?)
如果使用后者,则也可以尝试跟踪应用程序.