Vielleicht haben einige Demonstration Code in Ordnung ist. Vorausgesetzt, Sie einen Bausteinkopf wie so haben:
struct block {
void *data;
size_t len;
};
Sie würden den Block schützen, indem ein Mutex-Variable diese Struktur hinzugefügt:
struct block {
void *data;
size_t len;
pthread_mutex_t lock;
};
Sie brauchen dann die Initialisierungsfunktion für diese Struktur zu aktualisieren, zu initialisieren die Sperre:
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;
}
die X- und Y-Funktionen (und jede andere Funktion, oder schreibt auf den Block liest), dann brauchen das Schloss zu nehmen und an der Ausfahrt Mitteilung:
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;
}
Sie müssen vorsichtig sein, um sicherzustellen, dass Sie den Mutex auch in Fehlerrückwegen, zu entsperren.
Danke für Ihre Antwort. Muss ich nur einen Wert zusammen mit dem Block speichern, der anzeigt, ob er gelesen/geschrieben wird (Funktion X und Y)? (Ich bin neu auf Mutexe)? – Alex
@Alex Sie müssen nur pthread_mutex_lock (Mutex) aufrufen, bis der Mutex frei wird. – Ben
Sie können entweder einen 'pthread_mutex_t'-Wert in jedem Block haben oder eine 1: 1-Zuordnung zwischen den Speicherblöcken und einer Sperrentabelle erstellen. Sie sollten jedoch wirklich versuchen, verschiedene Threads zu meiden, die auf denselben Speicher zugreifen möchten, da Sie nicht möchten, dass Threads viel Zeit damit verbringen, auf Sperren zu warten. – nategoose