2017-10-12 2 views
0

Ich frage im Grunde, ob ich eine Sperre in einer Methode erhalte und eine zweite Methode von dieser Methode aufrufen, wird die zweite exklusiven Speicherzugriff erhalten? Hier ist ein Beispielcode. Als Referenz kodiere ich in C mit Pthreads.Ruft der Aufruf einer Methode innerhalb einer Methode mit einer Sperre exklusiven Zugriff auf den Speicher auf?

int count = 0; 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 

method1() { 
    pthread_mutex_lock(&mutex); 
    count++; 
    method2(); 
    pthread_mutex_unlock(&mutex); 
} 

method2() { 
    printf("count = %d\n", count); 
} 

Also, wenn Thread A beginnt und method1 Anrufe (Erwerb der Sperre), würde ein Ruf von method2 innerhalb method1 noch Erinnerung ist noch da A gesperrt werden muss, die Mutex-Sperre? Also können keine anderen Threads die Anzahl ändern, während A sie noch druckt?

+0

Kurze Antwort ist ja. Wenn jedoch ein anderer Thread auf Methode 2 zugreift, wird es keine Sperre geben. – MKR

+0

@MKR Also, was ist der Sinn eines Schlosses? 'method2' ist sowieso ein * read * -Prozess. –

+3

Wenn Sie nach der Mutex-Sperre fragen, ja, bleibt der Mutex gesperrt, bis der gesperrte Thread 'pthread_mutex_unlock' darauf aufruft. Dies ist jedoch nicht die gleiche Frage wie bei _ "Also können keine anderen Threads die Zählung ändern, während A sie noch druckt?" _ Das hängt ganz von der Gestaltung Ihres Codes ab. Thread-Synchronisation passiert nicht durch Magie, nur weil Sie einen Mutex verwenden. Wenn Sie einem anderen Thread sagen, dass er "count" ohne Thread-Synchronisation ändern soll, dann haben Sie Race Conditions. – yano

Antwort

0

Nein, method2 ist nicht exklusiv, da method1 den Mutex übernimmt. Alle anderen Threads können aufrufen und erhalten Zugriff auf method2 - unabhängig von der Mutex-Status.

Kein anderer Thread kann auf method1 zugreifen, aber method2 ist für alle Threads verfügbar.

Daher kann Thread X method2 aufrufen, während Thread Y method1 ausführt, die dazu führen kann, dass Thread X einen unvollständigen Wert druckt.

Wenn Sie method2 schützen möchten, müssen Sie den Mutex dorthin verschieben.

0

In diesem Fall wird der Zugang von method2()-countdurch die Mutex geschützt, wenn method2() von method1() genannt wird. Aber das gilt nicht gelten, wenn method2() von einem anderen Ort aufgerufen wurde, ohne den Mutex gehalten.

Verwandte Themen