2009-12-10 3 views
8

Existe-t-il un moyen de garantir qu'un goroutine fonctionnera uniquement dans un thread de système d'exploitation spécifique? Par exemple, lorsque les opérations de l'interface graphique doivent s'exécuter dans le thread graphique, plusieurs goroutines peuvent exécuter le code de l'interface graphique.Forcer des goroutines dans le même thread

GOMAXPROCS(1) fait le travail techniquement, mais cela va à l'encontre du but du multithreading.

LockOSThread() fonctionne également, mais cela empêche tout autre goroutine de fonctionner dans ce thread.

Existe-t-il un moyen de le faire, ou tout ce qui nécessite le même thread doit-il également fonctionner dans le même goroutine?

Répondre

8

Pour le meilleur de ma connaissance, pas actuellement. Je pense que la façon de faire cela serait d'écrire un Goroutine qui s'exécute dans le thread graphique et qui répond aux demandes des autres goroutines envoyées sur un canal. Par exemple, vous pouvez le faire lire à partir d'un canal qui accepte les pointeurs de fonction et exécuter ces fonctions.

+2

-1 Votre réponse à "Existe-t-il un moyen de garantir qu'un goroutine fonctionnera uniquement dans un thread de système d'exploitation spécifique?" est "écrire un Goroutine qui s'exécute dans le fil de l'interface graphique"? Comment est-ce censé m'aider? –

+3

Vous avez déjà signalé que LockOSThread vous permet de verrouiller le goroutine sur un thread spécifique. Faites-le simplement pour le fil de l'interface graphique. –

+0

Cela vous permet de verrouiller le goroutine sur le thread * current *, pas sur un thread spécifique arbitraire. – robx

3

Pourquoi voulez-vous faire cela? Je crois que runtime.LockOSThread() est nécessaire si vous créez une bibliothèque de liaison à partir du code C qui utilise le stockage local. Sinon, laissez simplement le planificateur multiplexer les goroutines pour vous.

Et notez que runtime.LockOSThread() empêche seulement d'autres goroutines de s'exécuter dans ce thread jusqu'à ce que vous appelez runtime.UnlockOSThread().

+0

1) Comme l'OP a laissé entendre que le code GUI a besoin de goroutines pour la simultanéité, mais peut ne pas vouloir partager la priorité des ressources CPU avec un autre code qui nécessite un débit supérieur bien que cela puisse être indésirable; 2) La possibilité de [restreindre goroutines engendrées] (https://stackoverflow.com/questions/30646391/does-runtime-lockosthread-allow-chout-goroutines-to-run-in-same-os-thread) à la même Thread OS [pourrait aider à la conception sans verrouillage de la concurrence] (https://github.com/keean/zenscript/issues/17#issuecomment-359338947). –

Questions connexes