118 votes

Les mutex sont nécessaires en javascript ?

J'ai vu ce lien: la mise en Œuvre de l'Exclusion Mutuelle dans JavaScript. D'autre part, j'ai lu qu'il n'y a pas de threads en javascript, mais qu'est-ce que cela veut dire?

Lorsque des événements se produisent, où dans le code peuvent-ils interrompre?

Et si il n'y a pas de threads en JS, je dois utiliser les mutex en JS ou pas?

Plus précisément, je me pose des questions sur les effets de l'utilisation des fonctions appelées par setTimeout() et XmlHttpRequests' onreadystatechange sur accessible dans le monde entier variables.

115voto

William Points 4403

Javascript est défini comme un réentrant langue qui signifie qu'il n'est pas de filetage exposés à l'utilisateur, il peut y avoir des fils dans la mise en œuvre. Des fonctions comme setTimeout() et rappels asynchrones besoin d'attendre pour le moteur de script pour le sommeil avant qu'ils ne soient en mesure d'exécuter.

Cela signifie que tout ce qui se passe dans un événement doit être terminé avant le prochain événement sera traité.

Cela étant dit, vous pourriez avoir besoin d'un mutex si votre code ne quelque chose où il attend une valeur à ne pas changer entre le moment où l'événement asynchrone a été congédié, et lorsque la fonction de rappel est appelée.

Par exemple, si vous avez une structure de données lorsque vous cliquez sur un bouton et il envoie un XmlHttpRequest qui appelle un rappel que les changements de la structure des données, destructeurs, et vous avez un autre bouton qui change la même structure de données directement, entre le moment où l'événement a été déclenché et quand le retour d'appel a été exécuté, l'utilisateur pourrait avoir cliqué et mise à jour de la structure de données avant le rappel qui pourrait perdre de la valeur.

Alors que vous pourriez créer une condition de course comme ça, c'est très facile de prévenir que, dans votre code, puisque chaque fonction sera atomique. Il serait beaucoup de travail et de prendre un peu bizarre modèles de codage pour créer la condition de la course en fait.

23voto

gorillatron Points 91

Les réponses à cette question est un peu dépassé difficile de corriger à la fois la réponse a été donnée. Et stil correct si vous cherchez à un client javascript de l'application qui n'utilise PAS les web workers.

Articles sur web-travailleurs:
le multithreading en javascript en utilisant les web workers
Mozilla sur les web workers

Cela montre clairement que javascript via le web des travailleurs a des capacités de multithreading. Comme en ce qui concerne la question sont les mutex nécessaires en javascript? Je ne suis pas sûr de cela. Mais ce stackoverflow post semble pertinent:
Exclusion mutuelle pour les N Threads Asynchrones

7voto

alzclarke Points 803

@William points,

vous pouvez avoir besoin d'un mutex si votre code ne quelque chose où il s'attend à une la valeur de ne pas changer entre le moment où l'événement asynchrone a été licencié et lorsque la fonction de rappel est appelée.

Cela peut être généralisé en outre - si votre code ne quelque chose où il attend le contrôle exclusif d'une ressource jusqu'à ce qu'une requête asynchrone se résout, vous pouvez avoir besoin d'un mutex.

Un exemple simple est l'endroit où vous avez un bouton qui déclenche un appel ajax pour créer un enregistrement dans le back-end. Vous pourriez avoir besoin d'un peu de code pour vous protéger de la gâchette utilisateurs en cliquant à l'extérieur et de créer ainsi de multiples dossiers. il y a un certain nombre d'approches à ce problème (par exemple, désactiver le bouton activer sur ajax succès). Vous pouvez également utiliser un simple verrou:

var save_lock = false;
$('#save_button').click(function(){
    if(!save_lock){
        //lock
        save_lock=true;
        $.ajax({
            success:function()
                //unlock
                save_lock = false;  
            }
        });
    }
}

Je ne sais pas si c'est la meilleure approche, et je serais intéressé de voir comment d'autres poignée d'exclusion mutuelle en javascript, mais pour autant que je suis conscient que c'est une simple mutex et il est très pratique.

3voto

Mike Stone Points 21293

JavaScript est mono-thread... mais Chrome peut être une nouvelle bête (je pense que c'est aussi à thread unique, mais chaque onglet dispose de sa propre JavaScript fil... je n'ai pas regardé en détail, afin de ne pas me citer là-bas).

Cependant, une chose que vous NE devez pas vous inquiéter au sujet est de savoir comment votre JavaScript gérer plusieurs requêtes ajax viennent pas du même ordre que vous leur envoyez. Donc, tout ce que vous vraiment besoin de s'inquiéter est assurez-vous que vos appels ajax sont traités d'une manière qu'ils ne seront pas l'un sur l'autre les pieds si les résultats sont de retour dans un ordre différent de celui que vous lui avez envoyé.

Cela vaut pour les délais d'attente trop...

Lorsque JavaScript pousse le multithreading, alors peut-être vous soucier de mutex et la comme....

-3voto

Constantin Points 12185

Événements sont signalés, mais l’exécution de JavaScript est toujours mono-thread.

Ma compréhension est que lorsque l’événement est signalé, que le moteur s’arrête à ce qu’il s’exécute au moment d’exécuter le gestionnaire d’événements. Après que le gestionnaire est terminé, l’exécution du script est reprise. Si le gestionnaire d’événements a changé certaines variables partagées puis repris code pourrez voir ces changements apparaissant « out of the blue ».

Si vous voulez « protéger » les données partagées, indicateur booléen simple devrait suffire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X