2009-12-10 29 views
8

Czy istnieje sposób, aby zapewnić, że goroutine będzie działać tylko w określonym wątku systemu operacyjnego? Na przykład, gdy operacje GUI muszą działać w wątku GUI, ale może istnieć wiele goroutin z uruchomionym kodem GUI.Zmuszanie goroutines do tego samego wątku

GOMAXPROCS(1) wykonuje zadanie technicznie, ale to pokonuje cel wielowątkowości.

LockOSThread() działa również, ale to uniemożliwia działanie innych goroutine w tym wątku.

Czy istnieje sposób, aby to zrobić, czy też wszystko, co wymaga tej samej nitki, działa również w tej samej goroutine?

Odpowiedz

8

Zgodnie z moją wiedzą, nie obecnie. Myślę, że "idiotyczny" sposób, aby to zrobić, to napisanie Goroutine'a, który działa w wątku GUI i żąda usług od innych goroutines wysyłanych przez kanał. Na przykład możesz go odczytać z kanału, który akceptuje wskaźniki funkcji i wykonywać te funkcje.

+2

-1 Twoja odpowiedź na pytanie "Czy istnieje sposób na zapewnienie, że goroutine będzie działał tylko w określonym wątku systemu operacyjnego?" to "napisz Goroutine'a, który działa w wątku GUI"? Jak to ma mi pomóc? –

+3

Już wskazałeś, że LockOSThread pozwala zablokować goroutine do określonego wątku. Po prostu zrób to dla wątku GUI. –

+0

Umożliwia to zablokowanie goroutine do wątku * current *, a nie do dowolnego konkretnego wątku. – robx

3

Dlaczego chcesz to zrobić? Wierzę, że runtime.LockOSThread() jest konieczne, jeśli tworzysz powiązanie biblioteki z kodu C, który używa magazynu lokalnego wątku. W przeciwnym razie po prostu niech scheduler zmultiplikuje wam goranki.

Pamiętaj, że runtime.LockOSThread() zapobiega tylko uruchomieniu innych goroutinów w tym wątku, dopóki nie zadzwonisz pod numer runtime.UnlockOSThread().

+0

1) Zgodnie z PO, kod GUI potrzebuje goroutinów do współbieżności, ale może nie chcieć dzielić się priorytetem zasobów procesora z innym kodem, który wymaga wyższej przepustowości, chociaż może to być niepożądane; 2) Zdolność do [ograniczenia spawned goroutines] (https://stackoverflow.com/questions/30646391/does-runtime-lockosthread-allow-child-goroutines-to-run-iname-os-os-thread) do tego samego Wątek systemu operacyjnego [mógłby pomóc w konstrukcji bez blokady projektu współbieżności] (https://github.com/keean/zenscript/issues/17#issuecomment-359338947). –

Powiązane problemy