Академический Документы
Профессиональный Документы
Культура Документы
Кафедра ВТ
Выполнил:
студент гр. 8В53
Сидоров А. О.
Проверил:
доцент каф. ВТ
Шерстнев В.С.
Томск 2008
Цель работы
Ознакомиться с подсистемой управления потоками в операционной системе Unix и основными
программными средствами для создания, управления и удаления потоков.
Ход работы
1. Ознакомился с теоретическим материалом
2. Разработал многопоточные программы
2.1. Разработал программу с использованием двух потоков, один из которых записывает в файл
положительные цифры, а другой - отрицательные.
2.1.1. Реализовал программу без синхронизации потоков
Исходные код:
#include <pthread.h>
#include <fstream.h>
ofstream output;
int main()
{
char* filename = "output.txt";
output.open(filename);
output.close();
}
Ни первый, ни второй поток не успевают выполнить задачу полностью за один квант времени, в
результате чего в файле output.txt смешиваются результаты работы первого и второго потоков.
2.1.2. Реализовал эту же программу, синхронизировав потоки при помощи мьютексов
Исходный код изменился несущественно: была добавлена глобальная переменная типа
pthread_mutex_t, инициализация этой переменной в методе main и непосредственно блокировка
критической секции посредством мьютекса:
#include <pthread.h>
#include <fstream.h>
ofstream output;
pthread_mutex_t outputMutexLock;
pthread_mutex_init(&outputMutexLock, NULL);
pthread_mutex_destroy(&outputMutexLock);
output.close();
}
pthread_mutex_lock(&outputMutexLock);
if (max > 0)
for (int i = 0; i < max; i++)
{
output << i << '\n';
sleep(1);
}
else
for (int i = max; i < 0; i++)
{
output << i << '\n';
sleep(1);
}
pthread_mutex_unlock(&outputMutexLock);
}
Скомпилировал и выполнил программу:
Просмотрел вывод программы:
int main()
{
srand(time(NULL));
pthread_mutex_init(&mutex, 0);
pthread_cond_init(&accessibilityCondition, 0);
pthread_t producingThread;
pthread_create(&producingThread, NULL, ProduceProduct, NULL);
pthread_t consumingThread;
pthread_create(&consumingThread, NULL, ConsumeProduct, NULL);
pthread_join(producingThread, NULL);
pthread_cancel(consumingThread);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&accessibilityCondition);
}
pthread_cond_signal(&accessibilityCondition);
}
}
#define n 10
sem_t connectionSemaphore;
pthread_mutex_t mutex;
int main()
{
time_t seconds;
time(&seconds);
srand((unsigned)seconds);
sem_init(&connectionSemaphore, 0, 10);
pthread_mutex_init(&mutex, 0);
pthread_t threads[n];
for (int i = 0; i < n; i++)
pthread_create(&threads[i], NULL, GetContent,
(void*)i);
for (int i = 0; i < n; i++)
pthread_join(threads[i], NULL);
sem_destroy(&connectionSemaphore);
pthread_mutex_destroy(&mutex);
}
Суть работы пула заключается в том, что определено фиксированное число одновременных
«подключений» (в данном случае 5), а «лишние» «подключения» ставятся в очередь. Скриншот не
иллюстрирует в полной мере работу программы (на самом деле поток 5 подключается сразу после
того, как поток 0 получил данные) из-за того, что помимо очереди семафора потоки выстраиваются и в
очередь мьютекса, блокирующего вывод.
Выводы:
В ходе выполнения лабораторной работы были изучены средства для создания, удаления и
синхронизации потоков. Синхронизация потоков может осуществляться посредством семафоров,
мьютексов и условных переменных. Семафор позволяет ограничить доступ к ресурсу определенному
числу потоков. Мьютекс является одноместным семафором. Условные же переменные позволяют
синхронизировать потоки, каким бы сложным не было их взаимодействие.