Ein Mutex ist etwas, das Sie greifen, und stoppt alle anderen Threads, die versuchen, es zu greifen, bis Sie es aus dem Grabbing-Thread freigeben.
In Ihrer Frage haben Sie eine Funktion zum Zuweisen einer Mutex-Instanz. Das ist nicht genug, um es zu sperren. Du musst mutex.lock() aufrufen (in Qt, aber auch generell, außer du verwendest pthread, in diesem Fall benutze pthread_mutex_lock und hab Spaß mit plattformabhängigen Sachen auf niedriger Ebene. Qt abstrahiert es sehr gut).
hier ein Beispiel mit Qt
void MyClass::doStuff(int c)
{
mutex.lock();
a = c;
b = c * 2;
mutex.unlock();
}
Sobald Sie die Sperre, um den Anruf zu g() erhalten wird aus dem Thread, der die Sperre bekam getan werden, so dass es in diesem Anruf allein seine unter der Annahme,, dass Sie g() nicht von anderen Threads aus einem anderen Teil des Codes aufrufen. Sperren bedeutet nicht, dass alle anderen Threads gestoppt werden. Es stoppt Threads, die versuchen, dieselbe Sperre zu erhalten, bis die Sperre aufgehoben wird.
Wenn dies der einzige Weg für Ihre Threads ist, g() zu erreichen, dann werden Sie auf diesen Zugriff synchronisiert.
Für den zweiten Teil Ihrer Frage, wenn der Mutex ein Instanzattribut ist, dann werden sie zwei verschiedene Mutexe sein. Sie müssen eine Klassen-Mutex-Instanz deklarieren und instanziieren und sich auf Ihre Sperrung beziehen. In diesem Fall wird jeder Versuch, eine Methode in der Klasse aufzurufen, die den Klassenmutex sperrt, effektiv synchronisiert, was bedeutet, dass keine zwei Threads diese Methode zusammen ausführen.
Zum Beispiel (ich weiß nicht Qt habe, so kann ich diesen Code nicht kompilieren, und ich hörte vor mit ihm 2 Jahren Codierung, so könnte es nicht funktionieren)
class Foo {
public:
void method(void) {
mutex.lock();
cout << "method called";
// long computation
mutex.unlock();
}
private:
QMutex mutex;
};
Ok, in diesem Fall, Angenommen, Sie haben zwei Threads, 1 und 2, und zwei Instanzen der Klasse Foo, a und b. Angenommen, Thread 1 ruft a.method() auf und Thread 2 ruft b.method() auf. In diesem Fall sind die beiden Mutexe unterschiedliche Instanzen, sodass jeder Thread den Aufruf unabhängig ausführt und parallel abläuft.
Angenommen, Sie haben zwei Threads, 1 und 2, und eine Instanz der Klasse Foo, die zwischen den beiden Threads geteilt wird. Wenn Thread 1 a.method() aufruft und Thread 2 a.method() aufruft, wird Thread 2 anhalten und warten, bis die Mutex-Sperre aufgehoben wird.
Schließlich
class Foo {
public:
void method(void) {
mutex.lock();
cout << "method called";
// long computation
mutex.unlock();
}
private:
static QMutex mutex;
};
QMutex Foo::mutex;
In diesem Fall ist der Mutex eine Klasse statische Variable. Sie haben nur eine Instanz des Mutex für jede Objektinstanz. Angenommen, Sie hatten dieselbe Situation wie im ersten Fall: zwei Threads und zwei Instanzen. Wenn in diesem Fall der zweite Thread versucht, b.method() aufzurufen, muss er darauf warten, dass a.method() vom ersten Thread abgeschlossen wird, da die Sperre jetzt eindeutig ist und von allen Instanzen Ihrer Klasse gemeinsam genutzt wird.
Für mehr Informationen, hat Qt ein nettes Tutorial auf Multithreading
https://doc.qt.io/qt-5/threads.html
+1 mit QT api –