NetNado
  Найти на сайте:

Учащимся

Учителям



Отчет по лабораторной работе №3 по курсу «Операционные системы»


Федеральное агентство по образованию РФ

Государственное образовательное учреждение
высшего профессионального образования

«ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Факультет автоматики и вычислительной техники

Кафедра информатики и проектирования систем

«ПРАКТИЧЕСКОЕ ЗНАКОМСТВО С ПОТОКАМИ И СИНХРОНИЗАЦИЕЙ ПОТОКОВ В ОС UNIX»

Отчет по лабораторной работе №3
по курсу «Операционные системы»
Студент группы 8В72 ___________________ М. В. Шевчик
Проверил ассистент ___________________ Д. В. Сидоров


Томск 2010

Цель работы

Ознакомиться с подсистемой управления потоками в операционной системе Unix и основными программными средствами для создания, управления и удаления потоков.

Задание

Изучить основные программные средства управления потоками ОС Unix, а также способы синхронизации потоков. Разработать приложения для многопоточных вычислений с использованием синхронизации посредством мьютексов, семафоров и условных переменных.

Выполнение работы

2. Разработать три многопоточные программы с использованием минимум двух потоков и различных средств синхронизации. Например: два потока записывают и читают информацию из одного файла; два потока увеличивают значение общей переменной; два потока с различной частотой считывают и записывают данные в общий буфер памяти.

3. Необходимо обеспечить синхронизированную работу потоков в критической секции с использованием:

  • мьютексов;

  • семафоров;

  • условных переменных.

Синхронизация с помощью мьютекса

В программе имеются 2 функции, записывающие в файл «put.txt» цифры «11» и «22».

#include


#include

#include

#include

#include

#include

#include

#include
pthread_mutex_t lock; //запирание мьютекса

ofstream out;
void* one (void* arg){

pthread_mutex_lock(&lock;);
for (int i=0;i<3;i++){

out<<"1 ";

}

pthread_mutex_unlock(&lock;);

return NULL;

}
void* two (void* arg){

pthread_mutex_lock(&lock;);

for (int i=0;i<3;i++){

out<<"2 ";

}

pthread_mutex_unlock(&lock;);

return NULL;

}
int main(){
out.open("put.txt");

pthread_mutex_init(&lock;, NULL); //инициализация мьютекса, значение по умолчанию
pthread_t threadA;

pthread_t threadB;
pthread_create(&threadA;,NULL,&one;,NULL); //создание потока

pthread_create(&threadB;,NULL,&two;,NULL); //создание потока
pthread_join(threadA,NULL); //блокирование работы потока в ожидании заверш потока

pthread_join(threadB,NULL);
pthread_mutex_destroy(&lock;);
out.close();}
Результат

g2u13@linux ~$ ./mutex.exe

g2u13@linux ~$ cat put.txt

11 11 11 22 22 22 g2u13@linux ~$

Синхронизация с использованием семафора

В программе 2 потока используя одну и ту же функцию, обращаются к переменной. Первый поток увеличивает её на 10, второй уменьшает на 5.

#include

#include


#include

#include

#include

#include

#include

#include
int count;

sem_t sem;
void* fun(void* arg){
int s =(int)arg;
sem_wait(&sem;); //ожидание на семафоре
for (int i=1;i<5;i++){

count=count+s;

printf("%i",count);

printf(" ");

}
sem_post(&sem;); //увеличение семафора на 1

return NULL;

}
int main(){

sem_init(&sem;,0,0); //инициализация семафора

sem_post(&sem;); //увеличение семафора на 1
pthread_t thread1,thread2;
pthread_create(&thread1;,NULL,&fun;,(void*)1);

pthread_create(&thread2;,NULL,&fun;,(void*)-5);
pthread_join(thread1,NULL);

pthread_join(thread2,NULL);
sem_destroy(&sem;);
return 0;}
Результат

g2u13@linux ~$./semafor.exe

10 20 30 40 35 30 25 20 g2u13@linux ~$
Синхронизация с помощью условных переменных

В программе 2 потока с функциями обращаются к общей переменной, один из них увеличивает переменную на 1, другой уменьшает на 1.
#include


#include

#include

#include
void* plus(void *arg);

void* min(void *arg);
int z;

pthread_mutex_t mutex;

pthread_cond_t cond; //условная переменная
int main()

{

pthread_mutex_init(&mutex;,0);

pthread_cond_init(&cond;,0); //инициализация условной переменной
pthread_t plusT;

pthread_create(&plusT;,NULL,plus,NULL);
pthread_t minT;

pthread_create(&minT;,NULL,min,NULL);
pthread_join(plusT, NULL);

pthread_cancel(minT);
pthread_mutex_destroy(&mutex;);

pthread_cond_destroy(&cond;);

}
void* plus(void *arg)

{

for (int i = 0; i < 5; i++)

{

pthread_mutex_lock(&mutex;);

printf("%i",z);

printf(" ");

z=z+1;

pthread_cond_signal(&cond;); //события потоков на усл переменной

pthread_cond_wait(&cond;, &mutex;); //ожидания события на УП

pthread_mutex_unlock(&mutex;);

}

}
void* min(void *arg)

{

while (true)

{
pthread_mutex_lock(&mutex;);
printf("%i",z);

printf(" ");

while (z>0) z=z-1;

pthread_cond_signal(&cond;);

pthread_cond_wait(&cond;, &mutex;);

pthread_mutex_unlock(&mutex;);

}

}
Результат

g2u13@linux ~$ ./usper.exe

0 1 0 1 0 1 0 1 0 1 g2u13@linux ~$

4. Убедиться в результативности применения средств синхронизации потоков, сравнив результаты работы программ с использованием и без использования средств синхронизации.

Теперь не будем использовать мьютексы в первой программе

#include


#include

#include

#include

#include

#include

#include
ofstream out;
void* one (void* arg){
for (int i=0;i<3;i++){

out<<"11 ";

}}
void* two (void* arg){

for (int i=0;i<3;i++){

out<<"22 ";

}}
int main(){
out.open("out.txt");
pthread_t threadA;

pthread_t threadB;
out.close();

}

После компиляции

g2u13@linux ~$ only.exe

11 22 11 22 11 22 g2u13@linux ~$

Вывод

Использование потоков может быть хорошим инструментом при необходимости обеспечить одновременное выполнение нескольких действий.

страница 1


скачать

Другие похожие работы: