2016-03-27 13 views
0

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 Bu

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

"Flag1" ve "flag2" üzerinde bir veri yarışınız var. Onları okurken okuduğunuzda, bir muteksin korunması altında yazmanıza yardımcı olmaz. –

+0

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. –

+0

@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

cevap

0

Sorun çözüldü: Sıralamayı korumak için thread_1done ve thread_2done kullanılır.

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

iplik 3 fonksiyonunun gerçek yürütme thread_tasks.h - Task 3'ün flag2 == 1 'e ihtiyaç duyuyorsunuz, o zaman belki de thread 2 flag2 reset görevini tamamlamamıştır. Dolayısıyla, görev 3, engellemesi durumunda 'a girmeyecektir.

+0

Bu sorunu çözmenin bir yolu var mı? – daemon7osh