2010-07-13 3 views

Répondre

6

Si vous lisez simplement les données, aucun verrou n'est requis.

Si vous écrivez les données ET vous vous souciez de la lecture des données de commande, vous devez utiliser CS pour vous assurer que la commande est correcte. (Notez que si l'objet a un état plus complexe qui n'est pas mis à jour dans une opération atomique, vous pouvez vous préoccuper davantage de l'ordre des lectures/écritures).

+0

Si vous ne vous souciez pas de l'ordre, vous voudriez toujours changer la variable en volatile, non? – Inverse

+0

L'utilisation de volatile est une architecture de compilateur dépendante de ce que cela signifie en termes de multi-threading. Lisez la documentation appropriée. –

1

Si rien ne change jamais les données, alors sur la plupart des architectures, non. Mais si rien ne change jamais les données, le code n'a aucun sens.

+0

C'est ce que je pensais. – GManNickG

+6

Il est très utile d'initialiser des globals avant d'engendrer des threads supplémentaires, et à partir de ce moment-là, les données sont lues en lecture mais jamais écrites à nouveau. –

0

Si votre exemple est censé être déjà complet alors non, vous n'avez pas besoin de verrouiller ou de gérer une section critique puisque vous ne modifiez rien.

Mais vous par exemple, comme il est, il est tout simplement inutile ..

Vous n'avez pas besoin de gérer les accès concurrents quand il y a des fils qui sont en train de lire des données simples (les choses sont différentes sur les structures de données itératives) mais est utile juste quand vous avez des données statiques qui n'ont pas besoin d'être changées. Dès que vous ajoutez un seul auteur, vous devez vous assurer que quand il écrit que personne ne lit, mais que tout le monde sera toujours capable de lire simultanément avec d'autres lecteurs si aucun écrivain ne fait son travail.

0

Vous n'avez pas besoin de verrouiller lorsque vous ne modifiez pas la mémoire partagée, mais votre exemple serait plutôt inutile puisque vous initialisez data, vous vérifiez sa valeur, mais vous ne la modifiez jamais ... le second thread est va être complètement inutile. Modifiez-vous la variable data n'importe où?

+0

il fait juste mon code moins, j'ai fichier .ini qui est lu et définit les données avant que les discussions sont démarrées, j'ai besoin d'accéder à cette information de plusieurs threads plus tard, sans le modifier :) pas inutile, l'application est très gros :)) – Tenev

+0

@tenev, je n'essaie pas de dire que ce que vous faites est inutile, mais l'exemple que vous nous avez donné implique que le second thread ne fera rien du tout parce que "data" est TOUJOURS 5 ... – Kiril

1

Si les données sont modifiées par un thread différent, vous avez besoin d'un guide de mémoire lors de la lecture afin d'assurer la cohérence. Un verrou est un moyen d'obtenir une barrière de mémoire, mais pas nécessairement le meilleur. Cependant, à moins que vous ne trouviez (par la mesure!) Que le verrouillage ralentit votre programme de manière significative, il ne vaut probablement pas la peine de s'inquiéter des alternatives.

Questions connexes