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

Учащимся

Учителям



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


ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение высшего профессионального образования
«ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Факультет автоматики и вычислительной техники
Кафедра ВТ


Отчет по лабораторной работе №3

по дисциплине «Операционные системы»
Знакомство с подсистемой управления потоками в операционной системе Unix


Выполнила:

студентка гр. 8В51

Юнусова М.Р.
Проверил:

доцент каф. ВТ

Замятин А.В.
Томск 2008

Цель работы


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

Задание на лабораторную работу


Изучить особенности работы с утилитой Make при создании проекта на языке С (С++) в ОС Unix, а также получить практические навыки использования утилиты GNU Make при создании и сборке проекта.

Исходные тексты созданных программ с пояснениями, иллюстрирующими ход выполнения работы.

  1. Синхронизация потоков с использованием мьютекса


В данной программе присутствуют два потока. В первом потоке происходит генерация случайных чисел и запись этих чисел в файл. Во втором потоке числа считываются из файла и выводятся на экран, подсчитывается и выводится сумма этих чисел.

#include

#include

#include

#include

ofstream output;

ifstream input;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

const char* filename = "output.txt";

const int n = 5;

void* Gen(void* arg);

void* Sum(void* arg);

int main(){

srand(time(NULL));

pthread_t GenThread, SumThread;

pthread_create(&GenThread;, NULL, Gen, NULL);

pthread_create(&SumThread;, NULL, Sum, NULL);

pthread_join(GenThread, NULL);

pthread_join(SumThread, NULL);

pthread_mutex_destroy(&mutex;);

}

void* Gen (void* arg){

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

pthread_mutex_lock(&mutex;);

output.open(filename);

output<<(rand() % 100)<<" ";

output.close();

pthread_mutex_unlock(&mutex;);

sleep(1);

}

}

void* Sum (void* arg){

int a, s=0;

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

pthread_mutex_lock(&mutex;);

input.open(filename);

input>>a;

cout<
s += a;

input.close();

pthread_mutex_unlock(&mutex;);

sleep(1);

}

cout<<"\nsum = "<
}

Вывод программы на экран:

13 77 33 49 16

sum = 188

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


Описанную выше программу можно реализовать с использованием для синхронизации потоков семафора. При этом исходный текст программы изменяется незначительно.

#include

#include


#include

#include

#include

ofstream output;

ifstream input;

sem_t semaphore;

const char* filename = "output.txt";

const int n = 5;

void* Gen(void* arg);

void* Sum(void* arg);

int main(){

srand(time(NULL));

sem_init(&semaphore;, 0, 1);

pthread_t GenThread, SumThread;

pthread_create(&GenThread;, NULL, Gen, NULL);

pthread_create(&SumThread;, NULL, Sum, NULL);

pthread_join(GenThread, NULL);

pthread_join(SumThread, NULL);

sem_destroy(&semaphore;);

}

void* Gen (void* arg){

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

sem_wait(&semaphore;);

output.open(filename);

output<<(rand() % 100)<<" ";

output.close();

sem_post(&semaphore;);

sleep(1);

}

}

void* Sum (void* arg){

int a, s=0;

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

sem_wait(&semaphore;);

input.open(filename);

input>>a;

cout<
s += a;

input.close();

sem_post(&semaphore;);

sleep(1);

}

cout<<"\nsum = "<
}

Вывод программы:

23 58 70 98 71

sum = 320

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


В данной программе присутствуют два потока. В первом потоке происходит сложение разделяемой переменной со случайными числами. Во втором потоке происходит деление этой переменной на 2, но лишь в том случае, если ее значение в данный момент времени является четным числом.

#include


#include

#include

#include

void* Addition(void* arg);

void* Division(void* arg);

int num = 1, add = 0;

pthread_mutex_t pmutex = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t pcond = PTHREAD_COND_INITIALIZER;

int main(){

srand(time(NULL));

pthread_t AdditionThread, DivisionThread;

pthread_create(&AdditionThread;, NULL, Addition, NULL);

pthread_create(&DivisionThread;, NULL, Division, NULL);

pthread_join(AdditionThread, NULL);

pthread_cancel(DivisionThread);

pthread_join(DivisionThread, NULL);

pthread_mutex_destroy(&pmutex;);

pthread_cond_destroy(&pcond;);

}

void* Addition(void* arg){

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

pthread_mutex_lock(&pmutex;);

add = rand() % 10 + 1;

cout<скачать

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