Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
Хабаровский государственный технический университет
Кафедра: “Вычислительной
техники.”
Лабораторная работа №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, т.к. данная функция генерирует этот сигнал для пробуждения.
Вывод.
Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.