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

Учащимся

Учителям



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



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

Государственное образовательное

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

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





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

Кафедра ВТ

ЛАБОРАТОРНАЯ РАБОТА №3
по дисциплине

«Операционные системы»
Выполнил:

Студент группы 8В51 _________ М. С. Гриценко
Руководитель:

_________ А. В. Замятин


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

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

  1. Ознакомились с теоретическим материалом

  2. В качестве основной задачи используем: увеличение общей переменной двумя потоками: случайное количество увеличений на случайную величину каждым потоком.

  3. С использованием мьютексов :

#include


#include

#include

#include

#include

#define max 10
pthread_mutex_t mutex;

int sum = 0;

int add;
void *myfunc(void *arg)

{

int version = *(int *)arg;

int count =3+ rand()%max;

for (int i=0; i
{

pthread_mutex_lock(&mutex;);

add = rand()%max;

printf("process%d:%d \n", version, add);

sum+=add;

pthread_mutex_unlock(&mutex;);

sleep(1);

}

}
int main(int argc, char *argv[])

{

pthread_t func1, func2;

srand ((unsigned)time(NULL));

pthread_mutex_init(&mutex;, NULL);

int t =1;

pthread_create(&func1;, NULL, myfunc,(void *)&t; );

t++;

pthread_create(&func2;, NULL, myfunc,(void *)&t; );

pthread_join(func1, NULL);

pthread_join(func2, NULL);

printf("processes was done\n");

printf("the sum is %d\n", sum);

pthread_mutex_destroy(&mutex;);

return EXIT_SUCCESS;

}

  1. С использованием семафоров :

#include


#include

#include

#include

#include

#include

#define max 10
sem_t semaphore;

int sum = 0;

int add;
void *myfunc(void *arg)

{

int version = *(int *)arg;

int count =3+ rand()%max;

for (int i=0; i
{

sem_wait( &semaphore;);

add = rand()%max;

printf("process%d:%d \n", version, add);

sum+=add;

sem_post( &semaphore;);

sleep(1);

}

}
int main(int argc, char *argv[])

{

pthread_t func1, func2;

srand ((unsigned)time(NULL));

sem_init( &semaphore;, 0, 1);

int t =1;

pthread_create(&func1;, NULL, myfunc,(void *)&t; );

t++;

pthread_create(&func2;, NULL, myfunc,(void *)&t; );

pthread_join(func1, NULL);

pthread_join(func2, NULL);

printf("processes was done\n");

printf("the sum is %d\n", sum);

return EXIT_SUCCESS;

}


  1. С использованием условной переменной:

#include


#include

#include

#include

#include

#define max 10
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int sum = 0;

int add;
void *myfunc(void *arg)

{

int version = *(int *)arg;

int count =3+ rand()%max;

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

{

pthread_mutex_lock(&mutex;);

pthread_cond_wait(&cond;, &mutex;);

add = rand()%max;

printf("process%d:%d \n", version, add);

sum+=add;

pthread_mutex_unlock(&mutex;);

pthread_mutex_lock(&mutex;);

pthread_cond_signal(&cond;);

pthread_mutex_unlock(&mutex;);

}

}
int main(int argc, char *argv[])

{

pthread_t func1, func2;

srand ((unsigned)time(NULL));

pthread_mutex_init(&mutex;, 0);

pthread_cond_init(&cond;, 0);

int t =1;

pthread_create(&func1;, NULL, myfunc,(void *)&t; );

t++;

pthread_create(&func2;, NULL, myfunc,(void *)&t; );


sleep(1);

pthread_mutex_lock(&mutex;);

pthread_cond_signal(&cond;);

pthread_mutex_unlock(&mutex;);

pthread_join(func1, NULL);

pthread_join(func2, NULL);

printf("processes was done\n");

printf("the sum is %d\n", sum);

return EXIT_SUCCESS;

}

Выводы:В ходе проделанной лабораторной работы ознакомились с подсистемой управления потоками в операционной системе Unix. Разрабатывая приложения с различными видами синхронизации заметили их принципиальное сходство. Сделали вывод, что синхронизация потоков дело достаточно несложное, но очень щепитильное, потому как малейший недочёт может привести к неработоспособности программы.



страница 1


скачать

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