2016-03-27 6 views
0

Я пытаюсь использовать многоядерные программы для реализации Mutex семафор для: Инициализация; Запросить право собственности; Освободить право собственности; Попробуйте владеть; Уничтожение.Как работает семафор мютексов?

Я создал 3 темы. Каждый поток работает с глобальной переменной «Ответ». 9 из 10 потоков выполняются последовательно. Но иногда поток 3 не выполнялся. Является ли 2-й поток мьютекс не выпущен?

Вот мой код: 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"; 
} 

Заголовок: 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

У вас есть гонка данных на 'flag1' и' flag2'. Это не помогает вам писать их под защитой мьютекса, когда вы их читаете без них. –

+0

Кроме того, передача данных в сторону, ваш код не гарантирует, что потоки выполняются последовательно. Вместо этого он гарантирует, что если поток N + 1 запускается впереди потока 'N', он просто ничего не делает, пропуская всю существенную обработку. У вас нет логики, которая заставляет поток 'N + 1' ждать завершения потока' N'. –

+0

@IgorTandetnik Если я не использую флаги, ответ иногда становится 162, потому что поток 3 выполняет перед потоком 2, что должно быть логикой для последовательного выполнения? – daemon7osh

ответ

0

Решена проблема: Используется thread_1done и thread_2done для поддержания последовательности.

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

реальное выполнение функции нити 3 - Task3 нужен флаг2 == 1, который в то время, возможно, поток 2 не завершил задачу сброса flag2. Таким образом, задача 3, вероятно, не входит в , если блок.

+0

Есть ли способ решить эту проблему? – daemon7osh