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);
}
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. –
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. –
@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