2009-09-21 5 views
1

J'ai une application multithread, j'utilise pthreads avec la fonction pthread_mutex_lock. Les seules données que je dois protéger sont dans une structure de données. Est-il sûr si je n'applique le verrou que lorsque j'écris dans la structure de données? Ou devrais-je appliquer la serrure chaque fois que je lis ou écris?Lecture de données de section critiques à l'aide de pthreads

J'ai trouvé une question similaire à celle-ci, mais c'était pour Windows, à partir de cette question, il serait que la réponse à la mienne serait que c'est ok. Je veux juste m'en assurer.

EDIT

suivi: Je veux passer un argument de ligne de commande et lecture de celui-ci (à partir de différents threads). Dois-je encore utiliser pthread_mutex_lock?

Répondre

3

Il est nécessaire d'appliquer le verrou lorsque vous lisez également, sauf si vous pouvez garantir des écritures atomiques (à ce stade, vous n'avez même pas besoin de verrouiller l'écriture). Le problème provient des écritures qui prennent plus d'un cycle. Imaginez que vous écrivez 8 octets en deux écritures de 4 octets. Si l'autre thread démarre après avoir été écrit à moitié, la lecture lira les données invalides. Il est très commun que cela arrive, mais quand il fait son un sacré bug à traquer.

+0

"c'est mieux" -> "c'est nécessaire". Les verrous doivent être respectés par tous les logiciels qui accèdent aux données en question. –

+0

merci, réponse éditée. – Goz

1

Oui, vous devez être verrouillé pour les lectures et les écritures.

Les compilateurs et les processeurs n'écrivent pas nécessairement dans un champ dans une structure de manière atomique. En outre, votre code peut ne pas écrire de manière atomique, et la structure peut, à certains moments, ne pas être synchronisée avec elle-même.

Si tout ce que vous devez partager est une valeur entière unique, vous pouvez choisir d'utiliser des entiers atomiques. GCC a des attributs atomiques que vous pouvez utiliser. Ce n'est pas aussi portable que d'utiliser les verrous pthreads.

4

Vous pouvez utiliser un pthreads_rwlock_t pour autoriser la simultanéité de "lecture unique OU lecteurs N". Mais si vous restez avec le pthread_mutex_lock général, il doit être acquis pour N'IMPORTE QUEL accès à la structure de données partagée qu'il protège, de sorte que vous réduisez les choses à la simultanéité "un lecteur ou écrivain".

Questions connexes