approche tout ou rien peut-être un code de démonstration est en ordre. En supposant que vous avez un en-tête de bloc comme ceci:
struct block {
void *data;
size_t len;
};
Vous protégerait le bloc en ajoutant une variable mutex à cette structure:
struct block {
void *data;
size_t len;
pthread_mutex_t lock;
};
Vous devez ensuite mettre à jour la fonction d'initialisation de cette structure pour initialiser la serrure:
struct block *new_block(size_t len)
{
struct block *b = malloc(sizeof *b);
b->data = malloc(len);
b->len = len;
pthread_mutex_init(&b->lock, NULL);
return b;
}
X et Y fonctions (et toute autre fonction qui lit ou écrit au bloc) alors besoin de prendre le verrou et relâchez à la sortie:
int x(struct block *b)
{
int retval;
pthread_mutex_lock(&b->lock);
/* code */
pthread_mutex_unlock(&b->lock);
return retval;
}
int y(struct block *b)
{
int retval;
pthread_mutex_lock(&b->lock);
/* code */
pthread_mutex_unlock(&b->lock);
return retval;
}
Vous devez prendre soin de vous assurer que vous déverrouillez le mutex même dans les chemins de retour d'erreur, aussi.
Merci pour votre réponse. Est-ce que j'ai juste besoin de stocker une valeur avec le bloc qui montre s'il est en train d'être lu/écrit (fonction X & Y)? (Je suis nouveau sur les mutex)? – Alex
@Alex Vous avez juste besoin d'appeler pthread_mutex_lock (mutex) il ne reviendra pas jusqu'à ce que le mutex devienne libre. – Ben
Vous pouvez avoir une valeur 'pthread_mutex_t' dans chaque bloc ou concevoir un mappage 1 à 1 entre les blocs de mémoire et une table de verrous. Vous devriez vraiment essayer d'éviter les différents threads voulant accéder à la même mémoire, car vous ne voulez pas que les threads passent beaucoup de temps à attendre sur les verrous. – nategoose