Изучение функций, предназначенных для синхронизации потоков в ОС

Страницы работы

Содержание работы

Цель работы:

Изучение функций, предназначенных для синхронизации потоков в ОС

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

Похожие материалы

Информация о работе

Тип:
Отчеты по лабораторным работам
Размер файла:
113 Kb
Скачали:
0