2010-11-22 10 views
1

Ich bin völlig neu auf PThreads und es scheint eine Menge unnötiger Informationen auf der ganzen Website, die ich angeschaut habe.Verwenden von Pthreads auf zwei Funktionen in C

Ich habe zwei Funktionen lassen Sie uns nur X und Y für jetzt nennen, diese beide arbeiten an Blöcken im Speicher. Wenn ein Thread läuft X Ich möchte nicht, dass andere Threads X oder Y auf dem gleichen Block aufrufen, wie kann ich sicherstellen, dass dies nie passieren wird?

Muss ich die Funktionen für bestimmte Blockwerte mutex sperren?

Antwort

0

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.

2

Sie müssen Mutexe verwenden.

Sie sollten den Code nicht sperren, Sie sollten Daten sperren. Erstellen Sie für jeden Block einen Mutex, sperren Sie ihn, während eine Funktion auf dem Block ausgeführt wird, und entsperren Sie ihn anschließend, wenn Sie fertig sind.

Ein Mutex ist ein Typ, der von pthread.h, pthread_mutex_t definiert wird. Zum Sperren und Entsperren des Mutex stehen Funktionen zur Verfügung. Diese Funktionen stellen sicher, dass immer nur ein Thread eine Sperre erhalten kann (wenn Sie nur eine Variable verwendet haben, um anzuzeigen, dass Ihr Block verwendet wird, haben Sie Probleme mit der Parallelität dieser Variablen anstelle des Blocks).

Es gibt zahlreiche Tutorials online verfügbar. Google "Pthread Tutorial" und Sie sollten genug finden, um sich selbst zu beginnen.

+0

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

+1

@Alex Sie müssen nur pthread_mutex_lock (Mutex) aufrufen, bis der Mutex frei wird. – Ben

+1

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

1

Sie sperren die Ressource - in diesem Fall einen Speicherblock - mit einem Mutex. Alternativ können Sie nur die Teile Ihres Funktionscodes sperren, die diesen Speicherbereich lesen/aktualisieren. Dies wird als kritischer Abschnitt bezeichnet und erfordert ein anderes Verfahren für die Codierung. Es bedeutet, dass Ihre Threads frei arbeiten können, außer wenn sie den Teil treffen, an dem sie mit der Ressource interagieren.

Die erste Methode ist einfacher zu implementieren - nur alles oder nichts-Ansatz für die gesamte Funktion X oder Y.

+0

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)? – Alex

0

Multi-Thread-Programmierung wird in höheren Programmiersprachen besser gelöst. Einige Dinge sind in C schwer zu verstehen, und meines Erachtens ist Multi-Threading einer von ihnen. Ich habe festgestellt, dass Java mir ein besseres Gefühl für die Probleme und Probleme gegeben hat. Es hat einfachere Konzepte und eine leichter zu lesende Dokumentation. Ein C++ Framework wie Poco oder Qt wäre auch besser, wenn Java nicht dein Ding ist.

Wie andere gesagt haben, wollen Sie konzeptionell Ressourcen sperren (in Ihrem Fall ein Abschnitt des Speichers). Semaphore passen sich diesem Konzept viel besser an als Mutex.Ich würde Semaphore recherchieren und Mutexe als Baustein von Semaphoren betrachten. Wenn Sie mich fragen, ist ein Mutex ein schlecht benannter binärer Semaphor.