Я пытаюсь использовать многоядерные программы для реализации 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);
}
У вас есть гонка данных на 'flag1' и' flag2'. Это не помогает вам писать их под защитой мьютекса, когда вы их читаете без них. –
Кроме того, передача данных в сторону, ваш код не гарантирует, что потоки выполняются последовательно. Вместо этого он гарантирует, что если поток N + 1 запускается впереди потока 'N', он просто ничего не делает, пропуская всю существенную обработку. У вас нет логики, которая заставляет поток 'N + 1' ждать завершения потока' N'. –
@IgorTandetnik Если я не использую флаги, ответ иногда становится 162, потому что поток 3 выполняет перед потоком 2, что должно быть логикой для последовательного выполнения? – daemon7osh