Je viens de commencer à apprendre la sécurité du fil. Cela me fait du code beaucoup plus défensivement, peut-être trop em> défensivement. p>
Utiliserait un langage fonctionnel comme Erlang me débarrasser complètement de cette préoccupation? P>
5 Réponses :
Disclaimer: Je sais pratiquement aucun erlang. Prenez mon avis avec un grain de sel. P>
Un langage purement fonctionnel qui (évidemment) n'autorise que les fonctions "pures". Wiki dit que les fonctions pures sont toujours sur le thread-coffre-fort, confirmant ainsi mon sentiment de gut sur ce sujet. p>
Mais je ne sais pas si Erlang est purement fonctionnel (Wiki implique autrement, alors je suppose que ce n'est pas). Peut-être qu'il utilise d'autres moyens d'atteindre la sécurité du thread. Quoi qu'il en soit, ses structures de données sont (principalement? Exclusivement?) Immuables, et sont donc intrinsèquement thread-coffre-fort. Et être une langue fonctionnelle, au moins un code d'erlang idiomatique n'utilisera pas (MUC? Toute autre variables globales mais utilisez plutôt des fonctions pures. Ce sont un fil-coffre-fort. Mais les choses d'E / S peuvent toujours être un problème ... Si un programme Erlang lit et écrit un fichier simultanément, un tel code peu probable pas de fil-coffre-fort. Mais la plupart du temps, vous irez bien grâce à des structures de données immuables et telle. P>
dans Erlang L'unité d'état d'exécution n'est pas un fil, mais un processus. Oui, c'est un type de processus léger mis en œuvre sur le dessus des fils; Mais c'est plus comme un processus qu'un fil. P>
Le point principal est que les processus ne partagent pas l'état, ils passent des messages; Alors que les threads partagent tout par défaut et doivent arbitrer pour éviter le chaos. P>
Ainsi, vous n'avez pas besoin de sécurité de fil puisque vous ne travaillez pas avec des threads. P>
Mais vous avez besoin de "sécurité de processus" :)
Javier a raison. p>
Cependant, j'aimerais juste ajouter quelque chose comme ça m'a attrapé auparavant. Si vous travaillez avec un pilote intégré ou un NIF, il peut ne plus être le fil en toute sécurité. Il semble évident que le conducteur ou le NIF utilisera du code C ou C ++, mais il convient de mentionner. Donc, vous ne pouvez pas ignorer complètement la sécurité du fil simplement parce que vous utilisez Erlang. p>
non. Voir Les acteurs de style Erlang sont tous sur le verrouillage . Il est beaucoup plus facile de réaliser la sécurité du fil dans une langue fonctionnelle, mais vous devez y réfléchir. P>
Je viens de commencer à apprendre la sécurité du fil. Cela me fait du code beaucoup plus défensivement, peut-être trop défensivement. P> blockQuote>
Notez que dans ce cas, il est très probable que vous obtiendrez toujours des choses mal. Partagé - tout ce que la concurrence est
très difficile à obtenir la droite forte> dans quoi que ce soit, à l'exception des exemples les plus triviaux. P>
Article intéressant, mais je ne pense pas que le "thread-coffre-fort" signifie librement mort. Dans le monde Java / C #, cela signifie généralement qu'un objet protégé contre des mises à jour simultanées et peut être utilisée dans un environnement multi-fileté en toute sécurité. La référence de l'OP à la programmation défensive suggère la même perspective.
Mais vous êtes correct. Les nouveaux programmeurs erlang ne peuvent ignorer la possibilité de verrous morts. Mais la chose intéressante à propos de l'article est qu'elle échappe à une façon de "casser" une molette morte sans arrêter le VM. Vous ouvrez une coque Erlang et appuyez sur un message au processus verrouillé.
Non, vous devez toujours envisager la sécurité du fil à Erlang, mais les problèmes sont beaucoup plus simples à résoudre. P>
j'ai lu un article dans lequel l'auteur a souligné que votre message API peut causer problèmes de filetage. L'exemple a été tourné autour d'un compte bancaire. Son message initial API avait obtenu des opérations. Certains codes qui souhaitaient déposer 100 $ recevraient la valeur actuelle, y ajouter 100, puis définir le résultat. Bien sûr, cela ne fonctionne que si un processus unique accède au compte bancaire. Une fois deux processus manipulant la balance, tous les paris sont éteints. P>
Sa solution consistait à changer l'API de message pour déposer et retirer (il utilise réellement un message - Mise à jour - mais vous obtenez l'idée). Cela provoque l'interaction d'assumer la sémantique atomique - le processus d'écoute ne traitera qu'un dépôt ou un retrait à la fois, et bloquera d'autres demandes jusqu'à la fin du premier. P>
Il est à noter que ce problème est essentiellement identique à celui du problème de mémoire partagée. (Si nous utilisons des messages pour interagir avec un processus, nous avons essentiellement créé une certaine mémoire partagée). Un autre blogueur compare les ETS à la mémoire partagée également. Cependant, tant que vous comprenez où vous avez introduit des constructions comme de la mémoire partagée et régulez l'accès à cette mémoire partagée, vous ne devez avoir aucun problème de threading (autre que l'impasse, bien sûr). P>