Лабораторная работа №3 по дисциплине «Операционные системы»
Федеральное агентство по образованию
Государственное образовательное
учреждение высшего профессионального образования
«ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Факультет автоматики и вычислительной техники
Кафедра ВТ
ЛАБОРАТОРНАЯ РАБОТА №3
по дисциплине
«Операционные системы»
Выполнил:
Студент группы 8В51 _________ М. С. Гриценко
Руководитель:
_________ А. В. Замятин
Томск – 2008
Цель: ознакомиться с подсистемой управления потоками в операционной системе Unix и основными программными средствами для создания, управления и удаления потоков.
Задание: изучить основные программные средства управления потоками ОС Unix, а также способы синхронизации потоков с использованием мьютексов. Разработать приложение для многопоточных вычислений с использованием синхронизации посредством мьютексов, семафоров и условных переменных.
Ход работы
Ознакомились с теоретическим материалом
В качестве основной задачи используем: увеличение общей переменной двумя потоками: случайное количество увеличений на случайную величину каждым потоком.
С использованием мьютексов :
#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;
}
С использованием семафоров :
#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;
}
С использованием условной переменной:
#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
скачать
Другие похожие работы: