2017-07-29 12 views
1

Menschen. Ich habe versucht, Mutex als Substitut für atomare Variablen zu verwenden, aber hat das Resut demonstriert, es scheint, dass der Mutex nicht instante ist, weil die "num" immer noch Zeit haben, sich halb zu ändern, was die if-Bedingung wahr macht. Funktioniert das so, oder mache ich gerade :().
Comente bitte .. thankes: Dpthread_mutex_lock ist nicht sofort ...?

#include <iostream> 
#include <pthread.h> 
#include <mutex> 
using namespace std; 

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 

int num = 450; 

void* print1 (void* e){ 
    while(1){ 
     if(num != 450 && num != 201){ 
     cout << "num-> "<<num<<endl; 
     } 

     pthread_mutex_lock(&mutex); 
     Sleep(0.5); 
     num = 450; 
     pthread_mutex_unlock(&mutex); 
    } 

} 

void* print2 (void* e){ 
    while(1){ 
     if(num != 450 && num != 201){ 
     cout << "num-> "<<num<<endl; 
     } 

     pthread_mutex_lock(&mutex); 
     Sleep(0.5); 
     num = 201; 
     pthread_mutex_unlock(&mutex); 
    } 

} 


int main(){ 

    pthread_t* threads1; 
    threads1 = new pthread_t; 

    pthread_t* threads2; 
    threads2 = new pthread_t; 
//------------------------------------- 
    pthread_create(threads1,NULL,print1,(void*)NULL); 
    pthread_create(threads2,NULL,print2,(void*)NULL); 
    pthread_join(*threads1,(void**)NULL); 
    pthread_join(*threads2,(void**)NULL); 

return false; 
} 

Ergebnis:

num-> 450 
num-> 450 
num-> 450 
num-> 450 
... 

Ich erwartete:

(blanck)... 

Antwort

2

Ihr Code synchronisieren keinen Zugriff auf den gemeinsam genutzten num Variable mit Schreib lesen Zugriff auf die gleiche Variable. Dies ist deutlich sichtbar, wenn mit -fsanitize=thread Kompilieren:

WARNING: ThreadSanitizer: data race (pid=3082) 
    Write of size 4 at 0x0000006020d0 by thread T1 (mutexes: write M9): 
    #0 print1(void*) test.cc:19 (test+0x000000400df0) 
    #1 <null> <null> (libtsan.so.0+0x000000024459) 

    Previous read of size 4 at 0x0000006020d0 by thread T2: 
    #0 print2(void*) test.cc:27 (test+0x000000400e3f) 
    #1 <null> <null> (libtsan.so.0+0x000000024459) 

Lesezugriff muss irgendeine Form der Synchronisation als auch, nicht nur Schreibzugriff. Andernfalls werden Sie möglicherweise nicht einmal Updates beobachten oder inkonsistente Daten sehen. Die Details sind eine Konsequenz der C++ memory model.

Verwandte Themen