3 回答

TA貢獻1772條經驗 獲得超6個贊
從第3天教程引述<-閱讀此內容以獲取更多信息。
Goroutines根據需要多路復用到系統線程上。當goroutine執行阻塞系統調用時,不會阻塞其他goroutine。
在某些時候,我們將對與CPU綁定的goroutine進行相同的操作,但是現在,如果要使用用戶級并行性,則必須設置$ GOMAXPROCS。或致電runtime.GOMAXPROCS(n)。
goroutine不一定與OS線程相對應。它可以具有較小的初始堆棧大小,并且堆棧將根據需要增長。
需要時,可以將多個gorouitines復用到單個線程中。
更重要的是,該概念如上所述,goroutine是一個順序程序,可能會阻塞自身,但不會阻塞其他goroutine。
Goroutines在gccgo中作為pthreads實現,因此它也可以與OS線程相同。它將OS線程的概念與我們在編程時對多線程的思想分開。

TA貢獻1825條經驗 獲得超4個贊
在參考編譯器(5g / 6g / 8g)中,主調度程序(src / pkg / runtime / proc.c)創建N個OS線程,其中N由runtime.GOMAXPROCS(n)(默認值為1)控制。每個調度程序線程都會從主列表中拉出一個新的goroutine并開始運行它。goroutine將繼續運行,直到進行系統調用(例如printf)或在通道上進行操作為止,此時調度程序將獲取下一個goroutine并從其停止的那一點開始運行它(請參閱gosched()調用src / pkg / runtime / chan.c)。
出于所有目的和目的,調度是使用協程實現的。可以使用setjmp()和longjmp()在C語言中編寫相同的功能,Go(以及其他實現輕量級/綠色線程的語言)只是為您實現了自動化。
輕量級線程的好處在于,因為它是所有用戶空間,因此創建“線程”非常便宜(分配小的默認堆棧),并且由于線程之間相互通信的固有結構而非常高效。缺點是它們不是真正的線程,這意味著單個輕量級線程可以阻止整個程序,即使看起來所有線程都應同時運行。
- 3 回答
- 0 關注
- 327 瀏覽
添加回答
舉報