You are on page 1of 5

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

Государственное образовательное
учреждение высшего профессионального образования
«ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

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


Кафедра ВТ

ЛАБОРАТОРНАЯ РАБОТА №3

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

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

Руководитель:
_________ А. В. Замятин

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

Ход работы
1. Ознакомились с теоретическим материалом
2. В качестве основной задачи используем: увеличение общей переменной
двумя потоками: случайное количество увеличений на случайную величину
каждым потоком.
3. С использованием мьютексов :
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#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<count; 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;
3
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;
}
4. С использованием семафоров :
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <semaphore.h>
#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<count; 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;
}

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


4
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#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. Разрабатывая приложе-
5
ния с различными видами синхронизации заметили их принципиальное
сходство. Сделали вывод, что синхронизация потоков дело достаточно несложное,
но очень щепитильное, потому как малейший недочёт может привести к неработо-
способности программы.