我正在創建一個在多個服務器上發送和接收數據的機制。服務器在Windows上運行,並使用Delphi 7。如何在Delphi多線程中避免使用100%的CPU?
發送數據在幾個併發線程中形成,不可能知道哪個線程將首先形成數據。將數據添加到緩衝區的時刻由CriticalSection同步。發送線程不斷檢查是否有任何新的數據要發送。通過這樣做,每個線程吃1個CPU核心。這種方式運行速度非常快,但即使服務器不發送數據,CPU也是100%左右。我需要多個線程,我需要避免這種高CPU使用率。
我已經嘗試了兩種選擇:
睡眠 - 如果在緩衝區中沒有數據我跑睡眠(1)。 CPU內核沒有加載,但對新數據的反應速度約爲100倍。這不是一個解決方案。
殺死和創建線程。如果緩衝區中沒有數據,我殺死線程。添加數據的函數將創建一個新線程。新線程將發送數據,釋放緩衝區並再次被殺死。 CPU負載減少,但創建和查殺需要太多時間。結果是速度降低了100倍。
有沒有其他的睡眠方式(1)沒有消耗100%CPU並且反應迅速?或者是否有可能在發生某些事件之前暫停線程?
問題得到解答。這適用於我https://stackoverflow.com/a/4401519/4052208。
見這樣的:HTTP://計算器。 com/questions/4401171 /自我暫停-delphi-thread-in-delphi-when-its-not-need-and-safe-resuming –
您是否嘗試過使用OmniThreadLibrary - http://otl.17slon.com/? – RBA
沒有你的線程檢查 - 添加工作時通知他們。線程可以等待像TEvent這樣的同步對象 - 當工作被添加到隊列中時,您可以獲取可用線程併發信號通知它開始工作。像OTL這樣的圖書館如果不需要任何足夠重新發明輪子的特殊功能,就可以實現這種類型的功能。 –