Цель работы:
Изучение функций, предназначенных для синхронизации потоков в ОС
Linux.
Задачи:
Получение практических навыков использования мьютексов и условных переменных для решения задач доступа к ресурсам.
Текст программы:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t cs;
pthread_cond_t bf,be;
struct MyBuffer{
int Data;
struct MyBuffer* Next;
struct MyBuffer* Prev;
};
struct MyBuffer* bg;
struct MyBuffer* eg;
int count=0;
int Put(int Data){
if(count>=20) return -1;
struct MyBuffer* tp;
tp=(struct MyBuffer *) malloc(sizeof(struct MyBuffer));
tp->Prev=NULL;
tp->Next=NULL;
tp->Data=Data;
if(bg==NULL){
bg=tp;
eg=bg;
}
else{
eg->Next=tp;
tp->Prev=eg;
eg=tp;
}
count++;
return 0;
}
int Get(void){
int Data;
if(bg==eg)return -1;
struct MyBuffer* tp;
tp=bg;
bg=bg->Next;
Data=tp->Data;
free(tp);
count--;
return Data;
}
int Producent(void *Param){
int Data=0;
while(1){
int Time=1+(int) (2.0*rand()/(RAND_MAX+1.0))/*+500*/;
// printf("Time %d\n",Time);
sleep(Time/*/1000*/);
pthread_mutex_lock(&cs);
while(Put(Data)==-1){
pthread_cond_wait(&be,&cs);
};
pthread_cond_signal(&bf);
pthread_mutex_unlock(&cs);
Data++;
if (Data>9)Data=0;
};
}
int Consument(void *Param){
int Data=0;
while(1){
int Time=1+(int) (1500.0*rand()/(RAND_MAX+1.0))+500;
sleep(Time/1000);
printf("\n");
pthread_mutex_lock(&cs);
Data=Get();
while(Data==-1){
pthread_cond_wait(&bf,&cs);
Data=Get();
};
pthread_cond_signal(&be);
pthread_mutex_unlock(&cs);
printf("Simbol %d",Data);
};
}
int main(int argc,char* argv[]){
pthread_t ThreadProducent;
pthread_t ThreadConsument;
pthread_mutex_init(&cs, NULL);
pthread_cond_init(&bf,NULL);
pthread_cond_init(&be,NULL);
bg=NULL;eg=NULL;
Put(-1);
pthread_create(&ThreadProducent,NULL,Producent,(void *)NULL);
pthread_create(&ThreadConsument,NULL,Consument,(void *)NULL);
pthread_join(ThreadProducent,NULL);
pthread_join(ThreadConsument,NULL);
return 0;
};
Результат выполнения программы:
[diversant_@localhost Programm]$ ./laba4
Simbol 0
Simbol 1
Simbol 2
Simbol 3
Simbol 4
Simbol 5
Simbol 6
Simbol 7
Simbol 8
Simbol 9
Simbol 0
Simbol 1
Simbol 2
Ответы на вопросы:
1) Дочерний поток выполняется раньше главного
2) Главная программа остается блокированной на попытки захвата мутекса.
3) Главная программа не дожидается сигнала от переменной и зависает
Вывод:
В OC Linux созданы различные средства синхронизации потоков во много аналогичные средствам Windows Мутексы(Критические секции), Условные переменные(События), Семафоры. В OC Linux существует несколько видов синхронизации пришедшие из разных стандартов Linux, POSIX, SUN
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.