2010-01-05 88 views
3

我正在研究在Linux上運行的嵌入式C++應用程序。我最近遇到了一些非常奇怪的pthreads性能問題。GDB下的Linux線程性能非常快,但極其緩慢

我的系統有8個線程通過pthread互斥鎖保護來回傳遞信息。當單獨運行我的應用程序時,採用互斥鎖時線程性能會非常慢。在500MHz的ARM板上鎖定和解鎖互斥約200次需要2.4秒,200MHz的板上需要更長的時間。

奇怪的是,當我在GDB下運行我的應用程序時,應用程序運行速度非常快。當GDB運行時,單獨運行2.4秒的代碼塊需要約2ms。

我已經在2個不同的基於ARM的SBC上測試了這種行爲:一個運行Linux 2.4.26,使用gcc 3.4.4和glibc 2.3.2,另一個使用gcc 3.4.4運行Linux 2.6.21, glibc 2.3.2。

經過廣泛的測試後,我懷疑問題出在pthreads庫,它恰好是兩個主板工具鏈上的相同版本。這很不幸,因爲我的SBC供應商沒有爲他們的主板提供各種各樣的工具鏈,我擔心他們都會遇到這個問題。有沒有人有任何洞察什麼可能會造成不良的表現,當不在GDB下運行?

回答

3

從來沒有在ARM上的pthreads的問題,我懷疑你的代碼中有種族或初始化問題。嘗試將您的代碼降低到可以重現問題的最小代碼。 您應該在此處發佈此代碼,或者您認爲相關的部分。

而且不要忘了,通常情況下,select isn't broken

你使用LinuxThreads或NPTL(「內核」的主題?) 如果您使用的是後者,你也可以嘗試與strace您的應用程序。

+0

你是對的,它當然沒有被打破。 :)我將問題縮小到了我們用於狀態機功能的第三方框架。它使用標準的pthread互斥體而不是遞歸互斥體。將互斥鎖更改爲遞歸會導致程序以與GDB相同的方式運行。感謝您的反饋意見! – Maha 2010-01-05 21:20:59

0

你確定你是按照你認爲的方式初始化互斥鎖嗎?這是在文件範圍變量或分配的東西嗎?我在想,由於內存初始化繪製的運氣,gdb最終會在互斥量上給你一組不同的選項。

+0

感謝您的反饋意見。它是一個全局變量,初始化如下:pthread_mutex_t pThreadMutex = PTHREAD_MUTEX_INITIALIZER; – Maha 2010-01-05 01:06:13

+0

Urk。在任何情況下都應該是安全的。我想你可以嘗試一個明確的初始化,並確保你喜歡這些選項。 – bmargulies 2010-01-05 02:53:15

1

你可以看一個想法是自旋計數值。這在ARM而不是Intel系統中肯定是不同的。

你可以嘗試使用「pthread_mutex_trylock()」,然後做一個明確的「sched_yield()」,如果它不能獲得鎖定,可能會在循環中增加一個毫秒級的休眠。有了這個,你可以打破鎖定操作,看看鎖上是否存在爭用。

我敢打賭,你需要看看源代碼或至少反彙編「pthread_mutex_lock」來解決它。