Использование мьютексов и условных переменных для решения задач доступа к ресурсам

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

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

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

Кафедра: ВМ

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

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

Тема «Синхронизация потоков»

Выполнил: ст. гр. ПО-11

Дедловских С. А.

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

Сорокин Н. Ю.

Хабаровск 2004

Цель работы:

Ознакомиться с функциями, предназначенными для синхронизации потоков в ОС Linux. Научиться использовать мьютексы и условные переменные для решения задач доступа к ресурсам.

Постановка задачи: Один поток производит данные, другой поток их потребляет. В промежуток времени между изготовлением и потреблением данные хранятся в буфере.

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

void* userr (void*);

void* wokerr (void*);

pthread_mutex_t my_sync;

int beg=0;

int end=1;

int buff[10];

int poln=0;

main( )

{

int tr=1;

pthread_t t1,t2;

pthread_attr_t attr1,attr2;

pthread_attr_init (&attr1);

pthread_attr_init (&attr2);

pthread_mutex_init (&my_sync, NULL);

pthread_create(&t2,&attr2,wokerr, (void *)NULL);

pthread_create(&t1, &attr1, userr, (void *)NULL);

pthread_join(t1,NULL);

pthread_join(t2,NULL);

}

void* userr(void* dummy) {

while (1) {

if(poln != 0) {

pthread_mutex_lock (&my_sync);

poln--;

printf("sym=%d          %d\n",buff[end],poln);

if (end==9) {end=0;} else {end++;}

pthread_mutex_unlock (&my_sync);

sleep(rand()%8);

}

}

return;

}

void* wokerr(void* dummy) {

int sym;

while (1) {

if(poln <= 9) {

pthread_mutex_lock (&my_sync);

if (beg==9) {beg=0;} else {beg++;}

sym=rand()%9 + 1;

buff[beg]=sym;

poln++;

printf("new sym=%d      %d\n",buff[beg],poln);

pthread_mutex_unlock (&my_sync);

sleep(rand()%5);

}

}

return;

}

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

new sym=2      1

get sym=2    0

new sym=8      1

get sym=8    0

new sym=2      1

new sym=7      2

new sym=6      3

get sym=2    2

new sym=8      3

get sym=7    2

new sym=7      3

new sym=8      4

new sym=9      5

1.  Уберите в первом примере функцию sleep.

2.  Уберите во втором примере функцию освобождения мьютекса из порожденного потока.

3.  Уберите в третьем примере функцию pthread_cond_signal.

1) Результат программы непредсказуем, т.к. два потока борются за владением одной переменной.

2) Т.к. в потоке отсутствовала команда освобождения мьютекса, то другой поток не мог захватить мьютекс. Программа выполнялась бесконечно.

3) В 3-м примере после удаления заданной функции ничего не произошло. Но без условной переменной нам пришлось бы опросить переменную.

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

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

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

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