2009-12-10 27 views
8

有沒有辦法確保goroutine只能在特定的操作系統線程中運行?例如,當GUI操作必須在GUI線程中運行時,但可能有多個運行GUI代碼的goroutine。強制goroutine進入同一線程

GOMAXPROCS(1)專門從事這項工作,但這打破了多線程的目的。

LockOSThread()也可以工作,但是也阻止其他任何goroutine在該線程中運行。

有沒有辦法做到這一點,或者是否所有需要相同線程的東西都在同一個goroutine中運行?

回答

8

據我所知,目前不是。我認爲這樣做的方式就是編寫一個在GUI線程中運行的Goroutine,併爲來自通過通道發送的其他goroutines的請求提供服務。例如,您可以從接受函數指針的通道讀取數據,並執行這些函數。

+2

-1您對「有沒有辦法確保goroutine只能在特定的操作系統線程中運行?」是「編寫一個在GUI線程中運行的Goroutine」?這應該如何幫助我? – 2009-12-10 21:20:30

+3

您已經指出LockOSThread允許您將goroutine鎖定到特定的線程。只需爲GUI線程執行此操作即可。 – 2009-12-11 17:34:35

+0

這使您可以將goroutine鎖定到* current *線程,而不是鎖定任意特定的線程。 – robx 2014-12-16 19:22:45

3

你爲什麼要這樣做?如果您從使用線程本地存儲的C代碼創建庫綁定,我相信runtime.LockOSThread()是必需的。否則,只需讓調度程序爲您複用goroutines。

並注意,runtime.LockOSThread()只會阻止其他goroutines在該線程中運行,直到您致電runtime.UnlockOSThread()

+0

1)由於OP意味着GUI代碼需要併發的goroutine,但可能不希望與其他需要更高吞吐量的代碼共享CPU資源的優先級,儘管這可能是不希望的; 2)[限制衍生的goroutines](https://stackoverflow.com/questions/30646391/does-runtime-lockosthread-allow-child-goroutines-to-run-in-same-os-thread)到相同的能力操作系統線程[可以幫助無鎖設計的併發性](https://github.com/keean/zenscript/issues/17#issuecomment-359338947)。 – 2018-01-22 23:06:05