Comme sblundy souligné, si tous les objets sont immuables, en lecture seule, vous n'avez pas besoin de vous soucier de verrouillage, cependant, cela signifie que vous pouvez copier des objets d'un lot. La copie implique généralement malloc et le malloc utilise le verrouillage de synchroniser les allocations de mémoire à travers les threads, donc des objets immuables peut acheter à moins que vous ne le pensez (malloc lui-même des échelles plutôt mal et le malloc est lente; si vous faites beaucoup de malloc dans une exécution de la section critique, ne pas s'attendre à de bonnes performances).
Quand vous avez seulement besoin de mettre à jour des variables simples (par exemple, 32 ou 64 bits int ou pointeurs), effectuez simplement une addition ou une soustraction d'opérations ou tout simplement permuter les valeurs de deux variables, la plupart des plates-formes offrent des "opérations atomiques" pour que (poursuite de la GCC offre de ces derniers). Atomique n'est pas la même que la thread-safe. Cependant, atomique permet de s'assurer, que si un thread écrit une version 64 bits de la valeur à un emplacement de mémoire, par exemple, et un autre thread lit, la lecture, on obtient la valeur avant l'opération d'écriture ou après l'opération d'écriture, mais jamais cassé de valeur entre l'opération d'écriture (par exemple, celui où les 32 premiers bits sont déjà les nouvelles, les 32 derniers bits sont toujours l'ancienne valeur! Cela peut se produire si vous n'utilisez pas accès atomique sur une telle variable).
Toutefois, si vous avez une structure C, avec 3 valeurs, que voulez mettre à jour, même si vous mettez à jour tous les trois, avec des opérations atomiques, ces trois opérations indépendantes, ainsi qu'un lecteur peut voir la structure, avec une valeur déjà en cours de mise à jour et deux pas en cours de mise à jour. Ici, vous aurez besoin d'un verrou si vous devez vous assurer, le lecteur voit toutes les valeurs dans la structure, soit l'ancienne ou la nouvelle valeur.
Une manière de faire de serrures échelle beaucoup mieux est d'utiliser R/W serrures. Dans de nombreux cas, les mises à jour de données sont plutôt rares (les opérations d'écriture), mais l'accès aux données est très fréquente (de la lecture des données), pensez collections (tables de hachage, arbres). Dans ce cas, R/W verrous acheter vous un énorme gain de performance, autant de fils peuvent tenir une lecture de verrouillage en même temps (ils ne vont pas se bloquer les uns les autres) et que si un thread veut un verrou d'écriture, tous les autres threads sont bloqués pour le moment la mise à jour est effectuée.
La meilleure façon d'éviter thread-problèmes est de ne pas partager toutes les données sur les threads. Si chaque thread traite la plupart du temps avec des données aucun autre thread n'a accès, vous n'aurez pas besoin de verrouillage pour que les données à tous (aussi pas d'opérations atomiques). Donc, essayez de partager que de peu de données que possible entre les threads. Ensuite, vous avez seulement besoin d'un moyen rapide pour déplacer des données entre threads, si vous avez vraiment pour (CCI, Entre le Thread de Communication). Selon votre système d'exploitation, la plate-forme et du langage de programmation (malheureusement, vous nous avez dit ni l'un ni l'), diverses méthodes puissantes pour le CCI pourrait exister.
Et enfin, une autre astuce pour travailler avec des données partagées, mais sans verrouillage est de s'assurer que les threads n'ont pas accès aux mêmes pièces que les données partagées. E. g. si deux threads partagent un tableau, mais on ne pourra y accéder même, l'autre seulement bizarre index, vous n'avez pas besoin de verrouillage. Ou si les deux partagent le même bloc de mémoire et on n'utilise que la moitié supérieure, l'autre seulement l'un en bas, vous n'avez pas besoin de verrouillage. Si ce n'est pas dit, ce qui se traduira par de bonnes performances, surtout pas sur les Processeurs multi-core. Les opérations d'écriture d'un thread à ce partage de données (exécution d'un seul cœur) peut forcer le cache pour être vidées pour un autre thread (en cours d'exécution sur une autre base) et ces vidages de cache sont souvent le goulot de la bouteille pour multithread applications en cours d'exécution sur le moderne, les Processeurs multi-core.