12 Stimmen

Sperren des Mutex in einem Thread und Entsperren in einem anderen

Wird dieser Code korrekt und übertragbar sein?

void* aThread(void*)
{
    while(conditionA)
    {
        pthread_mutex_lock(mutex1);
        //do something
        pthread_mutex_unlock(mutex2);
    }
}

void* bThread(void*)
{
    while(conditionB)
    {
        pthread_mutex_lock(mutex2);
        //do something
        pthread_mutex_unlock(mutex1);
    }
}

In der eigentlichen Anwendung habe ich drei Threads - zwei für das Hinzufügen von Werten zu einem Array und einen für das Lesen dieser Werte. Und ich brauche den dritten Thread, um den Inhalt des Arrays anzuzeigen, gleich nachdem einer der anderen Threads ein neues Element hinzugefügt hat.

18voto

user562374 Punkte 3752

Das ist es nicht. Wenn Thread A zu mutex_unlock(2) gelangt, bevor Thread B zu mutex_lock(2) gelangt, liegt ein undefiniertes Verhalten vor. Sie dürfen auch nicht den Mutex eines anderen Threads entsperren.

El pthread_mutex_lock Basisspezifikation der offenen Gruppe sagt dies:

Wenn der Mutex-Typ PTHREAD_MUTEX_NORMAL ist [...] Wenn ein Thread versucht, einen Mutex zu entsperren, den er nicht gesperrt hat, oder einen Mutex, der entsperrt ist, kommt es zu undefiniertem Verhalten.

8voto

caf Punkte 224189

Como Die Antwort von user562734 lautet Die Antwort ist nein - Sie können ein Thema, das von einem anderen Thema gesperrt wurde, nicht wieder freigeben.

Um die gewünschte Synchronisation zwischen Leser und Schreiber zu erreichen, sollten Sie Bedingungsvariablen verwenden - pthread_cond_wait() , pthread_cond_signal() und verwandte Funktionen.

0voto

W. Beckett Punkte 1

Einige Implementierungen erlauben das Sperren und Entsperren von Threads, um unterschiedlich sein.

#include <iostream>
#include <thread> 
#include <mutex> 

using namespace std;

mutex m;

void f() {m.lock();   cout << "f: mutex is locked" << endl;}

void g() {m.unlock(); cout << "g: mutex is unlocked" << endl;}

main()
{
      thread tf(f);    /* start f                           */
      tf.join();       /* Wait for f to terminate           */
      thread tg(g);    /* start g                           */
      tg.join();       /* Wait for g to terminate           */
}

Dieses Programm druckt

f: Mutex ist gesperrt g: Mutex ist entsperrt

System ist Debian linux, gcc 4.9.1. -std=c++11.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X