rust lang 為何去掉綠色執行緒?

時間 2021-05-30 00:01:35

1樓:戈君

linux中的M:N執行緒庫主要兩個問題:

TLS問題:從一次阻塞醒來後可能跑到另乙個native thread worker上去(假定native thread是1:1),新語言中的TLS可以不受影響,但如果呼叫的是原生C/C++函式且用到了TLS(比如通過gcc的__thread關鍵字宣告的),就很難解決。

不過TLS的實質是假定兩段邏輯會先後執行,對於越來越併發的程式而言,TLS應該要盡量避免使用,這就要看語言設計者對於併發的理解和展望了。

epoll_ctl問題:M:N執行緒庫中的阻塞API不可避免得要用到epoll_ctl,epoll背後的實現是加鎖紅黑樹,epoll_ctl的開銷和read/write這類函式相比不可忽略。

但在新語言這個層面來說,是可以通過一些方法做到只在建立和關閉fd時各呼叫一次epoll_ctl,讀寫時不呼叫的。加上雜湊到多個epoll之類的常規方法,這個問題可以解決。

GDB做一些開發是可以支援自定義棧的, 這個不是阻塞性因素。

棧尺寸的問題對於這種追求大量執行緒的設計來說,本來就是要解決的,移除了官方執行緒庫用native thread不意味著使用者就不需要解決這個問題,只會解決的更山寨。

2樓:

rust 原先那種 green thread 根本就不比 native thread 更輕量,而且會導致必須帶乙個複雜的 runtime,並對各種相關的庫帶來額外的複雜度(必須支援兩套排程器),因此他們決定把這個問題推遲到以後再解決,先從 core/std 中去掉

3樓:徐辰

主要是幾點原因:

相容性,Rust的定位類同於C/C++,如果使用micro thread會導致大量相容性問題,比如TLS不能用之類的。

green thread的stack實現出了問題,最早的做法是使用segmented stack,這樣可以讓stack按需增長,但後來發現segmented stack根本不像GCC手冊上說的那樣對效能「只有輕微影響」,所以這個方案被否了,但如果不用segmented stack則需要每個task都有乙個巨大的stack,64位還好,但在32位系統上記憶體是個大問題

偵錯程式不支援,現有的GDB和LLDB都不能識別附加的stack,導致除錯不能,而支援這個功能則需要對偵錯程式進行大量針對Rust green thread的改動,這些改動也基本不可能合併到upstream去

green thread需要大量的runtime支援,這與Rust最小化執行時的目標不一致。

可能還有其它原因,一時想不起來了,想起來再補。

為何植物在進化中選擇了綠色?

鵬鵬 鬼谷閒談 紫色地球,乙個殺生以護生的故事。鬼谷閒談 紫色地球 乙個殺生以護生的故事 嗶哩嗶哩 乾杯 bilibili 有一種 紫色地球假說 理論認為,地球最早被紫色古菌覆蓋,植物祖先如藍藻早年被紫色古菌壓制,只能撿一些剩下的光發展。所以無法吸收綠光。後來植物光合作用釋放氧氣,造成大氧化事件和休...

Ingress陣營代表色為何是藍色和綠色?

入坑以來一直很介意顏色 於是稍微考據了一下,以後有相關資料也會補充在這個答案裡。再有萌新發問的話,扔個鏈結就好啦!一 官方設定藏得有點深。Ingress Year One,Part 1 INGRESS REPORT中 https www.解釋了很多基本設定,包括 什麼是 XM?原始狀態下的 XM 是...

如果名偵探柯南中去掉新蘭感情線還會有那麼多人看嗎?

miyanoi 隔壁金田一最新漫畫女主都不出現了,那個女主還不拖後腿,喜歡推理的人不是還看,說實話我想少看點新蘭戲份,為了甜而甜修學篇看的尬得一批。平和現在也是為了甜而甜,隔壁快青才是小情侶甜甜的戀愛啊,雖然我更喜歡快新。 牧青繹 一般來說,任何作品中去掉任何正面的因素,看的人都會變少。如果說去掉新...