2017-05-04 39 views
3

我正在使用用於小型USB設備的用戶模式驅動程序。我的USB讀取循環應該是非常敏感的,它執行的操作應該非常小(不必是原子的)。就像內核模式驅動程序中的中斷服務程序一樣。在一個處理過程中,我需要創建一個線程並將一些參數傳遞給該讀取循環內的那個線程。在任何時候都有一個已經創建的線程或必要時創建線程

所以我需要知道該操作的確切上限。它不會超過200mS,或類似的東西。

下一個替代方案是在設備初始化時間(探測時間)執行線程初始化,然後休眠該線程,等待直到從讀線程發出信號爲止。但在這種情況下,線程總是在運行,這將是昂貴的。

什麼是最佳選擇?我的平臺是linux,他們說在linux中,線程的創建有非常短的操作。我需要決定什麼是最好的。保持線程始終處於活動狀態,或者在必要時創建線程。

+1

您是否嘗試過測量/獲取這兩個選項? –

+0

是的,由於線程塊是內存,所以始終創建線程並等待來自讀線程的信號正在浪費內存。否則從讀循環中創建線程可能會使讀線程延遲很長。 –

回答

2

現代機器有數百個,有時數千個線程被實例化並且始終處於「就緒」狀態。 「準備好」並不意味着「實際運行」。

因此,在設備初始化時再啓動一個線程並在大多數時間保持「就緒」狀態並且在罕見的時間內每做一次工作就沒有問題。

讓這個工作順利進行的技巧是確保線程正在等待事件發生。當一個線程正在等待某個信號時,它將消耗零或接近零的CPU。

每次你需要做某件事時開始一個新的線程可能會非常昂貴。一個新的線程通常需要分配內存,這可能是一個耗時的操作,特別是在內存不足的系統中,內存分配可能導致交換。

2

只需創建線程一次,並使其在某些信號量或互斥體上阻塞,直到發出信號爲止。這樣它就不會「一直在運行」,也不會「成本高昂」。這樣你就不需要處理這樣的情況:「如果線程在我需要某些處理時沒有啓動會怎麼樣」或者「如果系統很忙併且線程啓動很慢」呢?

只是一件小事:如果線程沒有做太多,我會用較小的堆棧大小對它進行初始化。