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

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

4 страницы (Word-файл)

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

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

Кафедра: “Вычислительной

техники.”

Лабораторная работа №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, т.к. данная функция генерирует этот сигнал для пробуждения.

Вывод.

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

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

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