我正在使用valgrind運行多線程套接字程序。客戶端將通過TCP向服務器發送請求,然後忙於等待布爾值。當調用服務於服務器響應的回調函數時,布爾值將被設置。一旦接收到響應(並設置了布爾標誌),服務器將再次發出請求,並在循環中重複執行此操作。我知道對共享變量(布爾值)的非同步訪問可能會導致線程問題,但我嘗試過使用pthread互斥體,並且程序減速了大約20%(這裏速度很重要)。我相信寫入共享布爾變量是好的,因爲它可以在一個週期內完成。valgrind在多線程套接字程序中失速
該程序在valgrind之外運行良好,但通常在使用valgrind運行時會停止運行。我離開程序在一夜之間運行..通常需要幾秒鐘才能完成,所以我不認爲這是一個等待程序完成的時間不夠的情況。線程由開源引擎框架(快速修復)管理,所以我認爲這不是線程創建/管理的問題。
有沒有人知道valgrind圍繞多線程程序/繁忙的等待循環/套接字通信(或這些組合)的任何問題?
忙於等待共享布爾變量不是「在單個循環中完成」,它在每個循環迭代中以幾個週期完成,並且如果您的忙循環等待TCP網絡上的往返行程,則循環可能會迭代數十億次(因此浪費數十億個CPU週期,可能在其他地方更好使用)。比你提到的任何一個更好的解決方案是等待一個條件變量,並讓回調函數發出條件變量的信號,以在數據準備就緒時喚醒你的線程。 – 2011-12-29 01:48:26
我在說寫入布爾變量是在一個週期內完成的(而不是整個繁忙的等待過程)。話雖如此,我應該說寫入布爾變量是自動完成的(因爲緩存未命中等可以推動單個字節的寫入超過單個CPU週期) – Taras 2011-12-29 05:18:35
什麼Jeremy說 - 忙等待是一個壞主意,條件變量是更好的,並且不太可能會變慢... – BillT 2014-03-31 17:22:30