33 votes

Ne sécurisation d'une variable avec un pthread mutex garantie et il n'est pas mis en cache?

Considérons un simple (global dans mon cas) de la variable:

int i;

Quelque part, cette variable est accessible

pthread_mutex_lock(i_mutex);
if(i == other value) {
  do_something();
}
pthread_mutex_unlock(i_mutex);

Un autre thread mises à jour i alors qu'il est titulaire d' i_mutex . Pourrait le compilateur cache la valeur de i donc Je n'ai pas la récente valeur ? Doit i volatile ?

37voto

Michael Burr Points 181287

pthread verrous de mettre en œuvre les barrières de la mémoire qui permettra de s'assurer que les effets de cache sont visibles pour les autres threads. Vous n'avez pas besoin de volatiles afin de traiter correctement la variable partagée i si l'accès à la variable partagée sont protégés par pthread mutex.

à partir de http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11:

Les fonctions suivantes synchroniser de mémoire à l'égard des autres threads:

fork()
pthread_barrier_wait()
pthread_cond_broadcast()
pthread_cond_signal()
pthread_cond_timedwait()
pthread_cond_wait()
pthread_create()
pthread_join()
pthread_mutex_lock()       // <====
pthread_mutex_timedlock()
pthread_mutex_trylock()
pthread_mutex_unlock()     // <====
pthread_spin_lock()
pthread_spin_trylock()
pthread_spin_unlock()
pthread_rwlock_rdlock()
pthread_rwlock_timedrdlock()
pthread_rwlock_timedwrlock()
pthread_rwlock_tryrdlock()
pthread_rwlock_trywrlock()
pthread_rwlock_unlock()
pthread_rwlock_wrlock()
sem_post()
sem_timedwait()
sem_trywait()
sem_wait()
semctl()
semop()
wait()
waitpid()

5voto

Jens Gustedt Points 40410

Un compilateur ne doit pas mettre en cache ces d'une valeur globale à travers un appel de fonction.

Mais je pense que votre question est mal posé. Tout d'abord, mutex POSIX ne fonctionnent que lorsque vous vous en tenez à leur sémantique. Donc, vous devez appliquer un peu de discipline dans votre code d'accès uniquement à des variables globales (i dans ce cas) d'où votre mutex est de tenir.

Deuxièmement, s'il vous plaît ne pense pas que l' volatile déclarations permettent de prévenir tout dommage qu'un tel non-respect des règles d'accès en serait la cause. Simultanément en lecture et en écriture dans la mémoire est un subtil sujet.

2voto

Randy Stegbauer Points 688

La réponse simple à votre question:
- Non, je vais être la valeur la plus récente.
- Non, je n'a pas à être volatile.

Le i_mutex protège votre accès à i...aussi longtemps que votre verrouiller le mutex chaque fois que vous lire et à l'écrire. Simple que cela.

En d'autres termes, vous n'avez pas à vous soucier de la mise en cache ou volatils.

Profiter, Randy

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