假設我們有一臺雙核機器,它具有一個主流的現代操作系統,能夠同時使用兩個內核。 如果我有兩個線程,P1和Q1相同的過程中,和他們發生開始創建子線程,也就是說,P2和Q2,在大約相同的機器週期,將OS執行線程同時創作?在OS內部可以線程創建併發運行?
我聽說創建線程很貴,所以問題出現了......
在此先感謝。
假設我們有一臺雙核機器,它具有一個主流的現代操作系統,能夠同時使用兩個內核。 如果我有兩個線程,P1和Q1相同的過程中,和他們發生開始創建子線程,也就是說,P2和Q2,在大約相同的機器週期,將OS執行線程同時創作?在OS內部可以線程創建併發運行?
我聽說創建線程很貴,所以問題出現了......
在此先感謝。
任何合理設計的操作系統都可以有多個處理器同時執行內核代碼。因此,線程創建中涉及的一些任務可能會同時發生。但是會有一些必要的序列化操作某些共享數據結構(例如分配內存,將新創建的威脅結構插入到全局列表中)。處理器可以爭奪同一個鎖,從而降低併發性。
系統/應用程序經常創建新線程以致線程創建的開銷實際上很重要可能被設計爲錯誤(相對於啓動時間在線程中執行的工作太少,而沒有充分利用重用的明顯優化來自池中的短暫線程)。
+1 - 我們見過多少次Start(),Join()? – 2012-04-16 15:00:51
它將不同步。有線程創建方面無法並行進行 - 如果內核內存管理器將兩個線程分配到同一個堆棧,那將是不幸的!
線程創建足夠昂貴,以至於在應用程序中完全避免執行線程是值得的。運行,因此線程池的普及。長時間運行的任務可以在應用程序的整個生命週期中完成,這通常意味着顯式線程終止(用戶代碼最壞,幾乎不可能),這是沒有必要的。
我認爲開發人員會不斷地啓動和停止線程,因爲他們喜歡將它們視爲「函數」,在開始時「傳遞參數」,並在線程結束時返回「返回」結果。這不是線程概念化的最佳方式。
什麼操作系統? – SLaks 2012-04-16 14:36:03
這兩個線程是在同一個進程或獨立進程內產生的嗎?它很重要。線程有一個父進程,他們必須從中啓動。考慮到這一點,你是否在考慮父進程的第一個線程?進程和線程是不一樣的。 – 2012-04-16 14:54:55