Хабаровский государственный технический университет
Кафедра: ВМ
Лабораторная работа №5
По предмету «Операционные системы»
Тема «Синхронизация потоков»
Дедловских С. А.
Проверил: преподаватель
Сорокин Н. Ю.
Хабаровск 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. Была разработана программа с использованием мьютексов для решения поставленной задачи.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.