Mutex semaforunu uygulamak için çok çekirdekli programlama çalışıyorum: Başlatma; Sahiplik isteğinde bulunun; Sahipliği bırakın; Sahipliği deneyin; Yıkım.Muteks semaforu nasıl çalışır?
3 adet başlık oluşturdum. Her iş parçacığı bir genel değişken üzerinde çalışır. 10 kez iplikten 9'u sırayla yürütülür. Ama bazen iplik 3'ü uygulamadı. 2. thread mutex salıvermedi mi?
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";
}
Başlık dosyası thread_tasks.cc: Burada
Kod Buusing 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);
}
"Flag1" ve "flag2" üzerinde bir veri yarışınız var. Onları okurken okuduğunuzda, bir muteksin korunması altında yazmanıza yardımcı olmaz. –
Ayrıca, veri yarışı, kodunuz, iş parçacığının sırayla yürütülmesini sağlamıyor. Bunun yerine, "N + 1" parçacığının "N" iş parçacığı önünden geçmesi durumunda, tüm önemli işlemleri atlayarak yalnızca hiçbir şey yapmamasını sağlar. N + 1'in "N" iş parçacığının tamamlanması için beklemesini sağlayan herhangi bir mantık yok. –
@IgorTandetnik Bayrakları kullanmazsam cevap bazen 162 olur, çünkü iş parçacığı 3 iş parçacığı 2'den önce yürütülür sıralı yürütme mantığı ne olmalıdır? – daemon7osh