Хабаровский государственный технический университет
Кафедра: “Вычислительной
техники.”
Лабораторная работа №5
По дисциплине: “Операционные системы.”
“Синхронизация потоков ”
выполнили: Семенова К.С.
Честюнина Е.П.
проверил: Сорокин Н.Ю.
Хабаровск
2004
Цель работы.
Ознакомиться с функциями, предназначенными для синхронизации потоков в ОС Linux. Научиться использовать мьютексы и условные переменные для решения задач доступа к ресурсам.
Текст программы.
#include <pthread.h>
#include <stdio.h>
const n=10;
void* potreb_thread (void*);
void* proiz_thread (void*);
pthread_mutex_t my_mutex;
pthread_cond_t nof_buf, f_buf;
int thread_done = 0;
int buf_free=1;
int buf_nofree=0;
int x=1;
int *buf[n];
int next_in=0;
int next_out=0;
main( ) {
pthread_t tid_potreb,tid_proiz;
pthread_attr_t attr_potreb, attr_proiz;
pthread_attr_init (&attr_potreb);
pthread_attr_init (&attr_proiz);
pthread_mutex_init (&my_mutex, NULL);
pthread_cond_init (&nof_buf, NULL);
pthread_cond_init (&f_buf, NULL);
pthread_create(&tid_potreb, &attr_potreb, potreb_thread,NULL);
pthread_create(&tid_proiz, &attr_proiz, proiz_thread,NULL);
exit(0);
}
void* potreb_thread(void* dummy) {
int out;
//int next_out=0;
while(1){
pthread_mutex_lock (&my_mutex);
if (buf_free) pthread_cond_wait(&nof_buf, &my_mutex);
if (buf[next_out]>=0) {
out=buf[next_out];
printf("Print simvol: %d\n", out);
next_out=(next_out+1)%(n+1);}
else {buf_free=1;buf_nofree=0;};
pthread_cond_signal (&f_buf);
pthread_mutex_unlock (&my_mutex);
sleep(2);
}
return;
}
void* proiz_thread(void* dummy) {
int out;
int in_inf=0;
//int next_in=0;
while(1){
pthread_mutex_lock (&my_mutex);
if (buf_nofree) pthread_cond_wait(&f_buf, &my_mutex);
in_inf=(in_inf+1)%10;
if (buf[next_in]<0) {buf[next_in]=in_inf;
printf("Insert simvol: %d\n", in_inf);
next_in=(next_in+1)%(n+1);}
else {buf_nofree=1;buf_free=0;};
pthread_cond_signal (&nof_buf);
pthread_mutex_unlock (&my_mutex);
sleep(1);
}
return;
}
Результаты работы программы.
Ответы на вопросы.
1. Функция sleep(n) позволяет потоку отдать процессор и перейти из состояния выполнения в состояние ожидания на указанный период времени. Как только отведенный период времени заканчивается, планировщик переводит процесс в состояние готовности к выполнению.
2. Если во втором примере убрать функцию освобождения мьютекса из порожденного потока, может возникнуть ситуация: родительский процесс не сможет выполнить вычисления, т.к. они производятся в критическом разделе, вход в который возможен только после освобождения мьютекса.
3. В случае удаления функции pthread_cond_signal родительский процесс зависнет на ожидании сигнала rx, т.к. данная функция генерирует этот сигнал для пробуждения.
Вывод.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.