2016-03-27 17 views
0

Ich versuche Multi-Core-Programmierung, zu implementieren Mutex Semaphor für: Initialisierung; Eigentumsrecht anfordern; Besitz freigeben; Versuchen Sie Besitz; Zerstörung.Wie Mutex-Semaphor funktioniert?

Ich habe 3 Themen erstellt. Jeder Thread arbeitet mit einer globalen Variablen Antwort. 9 von 10 Mal Threads werden sequenziell ausgeführt. Aber manchmal wurde Thread 3 nicht ausgeführt. Ist 2. threads mutex nicht freigegeben?

hier ist meine Code: thread_tasks.cc

void *task1(void *X) 
{ 

    int MValue = pthread_mutex_init(&Mutex,NULL); //Initialization 
    pthread_mutex_lock(&Mutex); //Request ownership 
    Answer = Answer * 32; //critical section 
    pthread_mutex_unlock(&Mutex); //Release ownership 
    flag1=1; 
    cout << "\nthread A Answer = " << Answer << endl; 
    cout<<"\nthread 1 executed successfully"; 
} 

void *task2(void *X) 
{ 
    if(flag1==1) 
{ 
    int RC = pthread_mutex_trylock(&Mutex); //Try ownership 
    cout<<"\nRC: "<<RC; 
    Answer = Answer/2; 
    flag2=1; 
    cout<<"\nthread 2 executed successfully"; 
    pthread_mutex_unlock(&Mutex); //Release ownership 
    pthread_mutex_destroy(&Mutex); //Destruction 

} 
} 



void *task3(void *X) 
{ 
    Answer = Answer+5; 
    cout<<"\nthread 3 executed successfully"; 
} 

Headerdatei: thread_tasks.h

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

void *task1(void *X); 
void *task2(void *X); 
void *task3(void *X); 

mutex_example.cpp

int Answer = 10; 
int flag1 = 0; 
int flag2 = 0; 
int main(int argc, char *argv[]) 
{ 

pthread_t ThreadA, ThreadB, ThreadC; 

cout << "Answer = " << Answer << endl; 
pthread_create(&ThreadA,NULL,task1,NULL); 
pthread_create(&ThreadB,NULL,task2,NULL); 
pthread_create(&ThreadC,NULL,task3,NULL); 
pthread_join(ThreadA,NULL); 
pthread_join(ThreadB,NULL); 
pthread_join(ThreadC,NULL); 

cout << "Answer = " << Answer << endl; 

return(0); 
} 
+1

Sie haben ein Datenrennen auf 'flag1' und' flag2'. Es hilft nicht, dass Sie sie unter dem Schutz eines Mutex schreiben, wenn Sie sie ohne lesen. –

+0

Auch, Daten Rennen beiseite, stellt Ihr Code nicht sicher, dass Threads sequenziell ausgeführt werden. Stattdessen stellt es sicher, dass, wenn ein Thread "N + 1" zufällig vor dem Thread "N" läuft, er einfach nichts tut und alle wesentlichen Verarbeitungen überspringt. Sie haben keine Logik, die den Thread 'N + 1' darauf wartet, dass der Thread' N' abgeschlossen wird. –

+0

@IgorTandetnik Wenn ich Flaggen nicht die Antwort verwenden manchmal 162 wird, weil Thread 3 vor Thread ausgeführt 2, was die Logik für die sequentielle Ausführung enthalten sein sollte? – daemon7osh

Antwort

0

Gelöst ist das Problem: Gebrauchte thread_1done und thread_2done für Sequenz beibehalten wird.

void *task1(void *X) 
    { 
     int MValue = pthread_mutex_init(&Mutex,NULL); //Initialization 
     pthread_mutex_lock(&Mutex); //Request ownership 
     Answer = Answer * 32; //critical section 
     pthread_mutex_unlock(&Mutex); //Release ownership 
     thread_1done=1; 
     cout << "\nthread A Answer = " << Answer << endl; 
     cout<<"thread 1 executed successfully"<<endl; 
    } 


    void *task2(void *X) 
    { 
     while(1) 
      if(thread_1done==1) 
      { 
       int RC = pthread_mutex_trylock(&Mutex); //Try ownership 
       Answer = Answer/2; 
       pthread_mutex_unlock(&Mutex); 
       thread_2done=1; 
       cout << "\nthread B Answer = " << Answer << endl; 
       cout<<"thread 2 executed successfully"<<endl; 
       break; 
      } 
    } 



    void *task3(void *X) 
    { 
     while(1) 
      if (thread_2done==1 && thread_1done == 1) 
      { 
       int RC = pthread_mutex_trylock(&Mutex); //Try ownership 
       Answer = Answer+5; 
       pthread_mutex_unlock(&Mutex); 
       pthread_mutex_destroy(&Mutex); //Destruction 
       cout << "\nthread C Answer = " << Answer << endl; 
       cout<<"thread 3 executed successfully"<<endl; 
       break; 
      } 
    } 
0

die tatsächliche Ausführung des Gewindes 3-Funktion - task3 brauche flag2 == 1, was zu der Zeit vielleicht Thread 2 die Flag2 Reset Aufgabe beendet hat. So Aufgabe ist 3 wahrscheinlich nicht in den wenn Block.

+0

Gibt es eine Möglichkeit, dieses Problem zu lösen? – daemon7osh