Ознакомление с функциями, предназначенными для синхронизации потоков в OC Linux

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

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

Министерство Образования Российской Федерации

Хабаровский Государственный Технический Университет

Кафедра «ВТ»

Лабораторная работа №5

По дисциплине «Операционные системы»

Синхронизация потоков.

Выполнили студенты гр. ВМ-11  

Рудмин В.Н.

Лагвиненко В.В.

Проверил  преподаватель

Соркин Н.Ю.

Хабаровск 2004

Цель работы:  ознакомиться с функциями, предназначенными для синхронизации потоков в OC

Linux. Научиться использовать mutex’ы и условные переменные для решения задач    

доступа к ресурсам. 

1. Исходникпрограммы.

#include <pthread.h>

#include <stdio.h>

int buffer[10];

int bdp=1, edp=1;

pthread_mutex_t my_mtx;

pthread_cond_t my_sv;

void* sourser_thd(void *t)

{

int t1;

pthread_mutex_lock(&my_mtx);

while(1)

{

if((bdp==1 && edp==10)||(edp==bdp-1))

pthread_cond_wait(&my_sv,&my_mtx);

else

{

buffer[edp]=edp;

printf("simbol %d in buffer\n",buffer[edp]);

edp=edp+1;

if (edp>10) edp=1;

pthread_cond_signal(&my_sv);

pthread_mutex_unlock(&my_mtx);

}

t1=rand()%3+0.5;

sleep(t1);

}

return;

}

void* extructor_thd(void *d)

{

int t2;

pthread_mutex_lock(&my_mtx);

while(1)

{

if(edp==bdp)

pthread_cond_wait(&my_sv,&my_mtx);

else

{

buffer[bdp];

printf("simbol %d OUT BUFFER\n",buffer[bdp]);

buffer[bdp]=0;

bdp=bdp+1;

if (bdp>10) bdp=1;

pthread_cond_signal(&my_sv);

pthread_mutex_unlock(&my_mtx);

}

t2=rand()%3+0.5;

sleep(t2);

}

return;

}

main()

{

pthread_t s_id, e_id;

pthread_mutex_init(&my_mtx,NULL);

pthread_cond_init(&my_sv,NULL);

pthread_create(&s_id,NULL,&sourser_thd,NULL);

pthread_create(&e_id,NULL,&extructor_thd,NULL);

pthread_join(s_id,NULL);

pthread_join(e_id,NULL);

return;

}

Результат работы программы.


simbol 1 in buffer

simbol 1 OUT BUFFER

simbol 2 in buffer

simbol 3 in buffer

simbol 2 OUT BUFFER

simbol 4 in buffer

simbol 3 OUT BUFFER

simbol 5 in buffer

simbol 6 in buffer

simbol 7 in buffer

simbol 4 OUT BUFFER

simbol 8 in buffer

simbol 9 in buffer

simbol 5 OUT BUFFER

simbol 6 OUT BUFFER

simbol 10 in buffer

simbol 1 in buffer

simbol 2 in buffer

simbol 3 in buffer

simbol 7 OUT BUFFER

simbol 4 in buffer

simbol 8 OUT BUFFER

simbol 5 in buffer

simbol 6 in buffer

simbol 7 in buffer

simbol 9 OUT BUFFER

simbol 8 in buffer

simbol 10 OUT BUFFER

simbol 1 OUT BUFFER

simbol 9 in buffer

simbol 2 OUT BUFFER

simbol 10 in buffer

simbol 1 in buffer

simbol 3 OUT BUFFER

simbol 2 in buffer

simbol 4 OUT BUFFER

simbol 5 OUT BUFFER

simbol 3 in buffer

simbol 6 OUT BUFFER

simbol 4 in buffer

simbol 5 in buffer

simbol 7 OUT BUFFER

simbol 6 in buffer

simbol 8 OUT BUFFER

simbol 7 in buffer

simbol 9 OUT BUFFER

simbol 8 in buffer

simbol 10 OUT BUFFER

simbol 1 OUT BUFFER

simbol 9 in buffer

simbol 2 OUT BUFFER

simbol 10 in buffer

...

...


2.  Ответы на вопросы пункта 1.

Пример 1.

_with sleep(2);

X value in thread before sleep = 1

X value in thread is incremented by 1 before sleep

Main thread increments X, after that X value is 3

X value in thread after sleep = 3

_Поток выводит сообщение с задержкой, поэтому главный процесс успевает изменить значение Х.

_without sleep(2);

X value in thread before sleep = 1

X value in thread is incremented by 1 before sleep

X value in thread after sleep = 2

Main thread increments X, after that X value is 3

_Поток успевает вывести сообщение до того, как доступ к Х

получит главный процесс.

Пример 2.

_with pthread_mutex_unlock(&my_sync);

X value in thread before sleep = 1

X value in thread is incremented by 1 before sleep

X value in thread after sleep = 2

Main thread increments X, after that X value is 3

_Главный процесс при попытке захвата mutex'a замораживается, так как тот уже захвачен потоком, и возобновляет свою работу только после того как поток вызовет функцию pthread_mutex_unlock();

_without pthread_mutex_unlock(&my_sync);

X value in thread before sleep = 1

X value in thread is incremented by 1 before sleep

X value in thread after sleep = 2

..

(_долго ждем -> надоедает -> жмём Ctrl+C_)

_Главный процесс при попытке захвата mutex'a замораживается, так как тот уже захвачен потоком. Т.к. поток не вызывает функцию

pthread_mutex_unlock(), главный процесс никогда не возобновляет свою работу.

Пример 3.

_with thread_cond_signal();

X value in thread before sleep = 1

X value in thread is incremented by 1 before sleep

X value in thread after sleep = 2

Main thread increments X, after that X value is 3

_Главный процесс запускает поток и производит захват mutex'a.

Поток выводит 2 сообщения, пытается захватить mutex, но т.к.

тот уже захвачен, поток замораживается.

Главный процесс производит проверку флага т.к. тот не установлен он передает управление потоку. Поток производит захват mutex'a выводит сообщение, устанавливает флаг, вызывает pthread_cond_signal() и освобождает mutex. Главный процесс выводит сообщение и завершает свою работу.

_without thread_cond_signal();

_

Результат работы программы не изменяется.

Вывод:при совместном использовании данных потоками, могут возникнуть    различного рода ошибки, которые могут привести как просто к некорректному выполнению программы, так и к серьёзным сбоям в    системе. Для исключения таких ситуаций необходимо производить синхронизацию потоков, заключающуюся в контроле доступа к   используемым ресурсам. ОС Linux предоставляет набор функций     позволяющих обеспечить синхронизацию потоков. Существует два  основных метода, это использование семафоров и сигнальных  переменных.

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

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

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