Помощь студентам дистанционного обучения: тесты, экзамены, сессия
Помощь с обучением
Оставляй заявку - сессия под ключ, тесты, практика, ВКР
Скоро вступительные экзамены?

Лабораторная работа по базам данных (Вариант 40)



Помощь с дистанционным обучением
Получи бесплатный расчет за 15 минут
 

Введите контактный e-mail:

 

Введите номер телефона

 

Что требуется сделать?

 

Каким способом с Вами связаться?:

E-mail
Телефон
Напишем вам на вашу почту
 
Перезвоним вам для уточнения деталей
 
Перезвоним вам для уточнения деталей
 

или напишите нам прямо сейчас

Написать в WhatsApp
 

Лабораторная Работа №2. Разработка многопоточного приложения средствами POSIX в ОС Linux или Mac OS
Цель работы
Знакомство с многопоточным программированием и методами синхронизации потоков средствами POSIX.

Задание

1.С помощью таблицы вариантов заданий выбрать граф запуска потоков в соответствии с номером варианта. Вершины графа являются точками запуска/завершения потоков, дугами обозначены сами потоки. Длину дуги следует интерпретировать как ориентировочное время выполнения потока. В процессе своей работы каждый поток должен в цикле выполнять два действия:
i.выводить букву имени потока в консоль;
ii.вызывать функцию computation() для выполнения вычислений, требующих задействования ЦП на длительное время. Эта функция уже написана и подключается из заголовочного файла lab2.h, изменять ее не следует.
2.В соответствии с вариантом выделить на графе две группы с выполняющимися параллельно потоками. В первой группе потоки не синхронизированы, параллельное выполнение входящих в группу потоков происходит за счет планировщика задач (см. примеры 1 и 2). Вторая группа синхронизирована семафорами и потоки внутри группы выполняются в строго зафиксированном порядке: входящий в групу поток передает управление другому потоку после каждой итерации цикла (см. пример 3 и задачу производителя и потребителя). Таким образом потоки во второй группе выполняются в строгой очередности.
3.С использованием средств POSIX реализовать программу для последовательно-параллельного выполнения потоков в ОС Linux или Mac OS X. Запрещается использовать какие-либо библиотеки и модули, решающие задачу кроссплатформенной разработки многопоточных приложений (std::thread, Qt Thread, Boost Thread и т.п.). Для этого необходимо написать код в файле lab2.cpp:
i.Функция unsigned int lab2_thread_graph_id() должна возвращать номер графа запуска потоков, полученный из таблицы вариантов заданий.
ii.Функция const char* lab2_unsynchronized_threads() должна возвращать строку, состоящую из букв потоков, выполняющихся параллельно без синхронизации (см. примеры в файлах lab2.cpp и lab2_ex.cpp).
iii.Функция const char* lab2_sequential_threads() должна возвращать строку, состоящую из букв потоков, выполняющихся параллельно в строгой очередности друг за другом (см. примеры в файлах lab2.cpp и lab2_ex.cpp).
iv.Функция int lab2_init() заменяет собой функцию main(). В ней необходимо реализовать запуск потоков, инициализацию вспомогательных переменных (мьютексов, семафоров и т.п.). Перед выходом из функции lab2_init() необходимо убедиться, что все запущенные потоки завершились. Возвращаемое значение: 0 — работа функции завершилась успешно, любое другое числовое значение — при выполнении функции произошла критическая ошибка.
v.Добавить любые другие необходимые для работы программы функции, переменные и подключаемые файлы.
vi.Создавать функцию main() не нужно. В проекте уже имеется готовая функция main(), изменять ее нельзя. Она выполняет единственное действие: вызывает функцию lab2_init().
vii.Не следует изменять какие-либо файлы, кроме lab2.cpp. Также не следует создавать новые файлы и писать в них код, поскольку код из этих файлов не будет использоваться во время тестирования.
Последовательное выполнение потоков может обеспечиваться как за счет использования семафоров, так и с помощью функции pthread_join(). Запускать потоки можно все сразу в функции lab2_init(), а можно и по одному (или группами) из других потоков.
В процессе своей работы каждый поток выводит свою букву в консоль. Оценка правильности выполнения лабораторной работы осуществляется следующим образом. Если потоки a и b согласно графу должны выполняться одновременно (параллельно), то в консоли должна присутствовать последовательность вида abababab (или схожая, например, aabbba); если потоки выполняются последовательно, то в консоли присутствует последовательность вида aaaaabbbbbb, причем после появления первой буквы b, буква a больше не должна появиться в консоли.
Количество букв, выводимых каждым потоком в консоль, должно быть пропорционально числу интервалов (длине дуги), соответствующей данному потоку на графе. При этом количество символов, выводимых в консоль каждым из потоков, должно быть не меньше чем 3Q и не больше чем 5Q, где Q — количество интервалов на графе, в течении которых выполняется поток. Множитель перед величиной Q следует выбрать одинаковым для всех потоков, задав его равным 3, 4 или 5.
Варианты заданий

Исходный код:

#include
#include
#include #include
#include
#include
using namespace std;

typedef struct
{
uintptr_t *a;
uintptr_t length;
uintptr_t sum;
} MyData;

#define N 5
#define L 20

static MyData mData;
static pthread_t myThread[N];
static sem_t sem1, sem2;
static uintptr_t *a = reinterpret_cast<uintptr_t*>( malloc (N*L*sizeof(uintptr_t)) );

void *threadWork(void *arg)
{
uintptr_t offset = reinterpret_cast(arg);
uintptr_t sum = 0;
uintptr_t start = offset * mData.length;
uintptr_t end = start + mData.length;
//Критическая секция №3
sem_wait(&sem1);
printf(«\nThread \»%llu\» at work\n», offset + 1);
for (uintptr_t i = 0; i < L/N; i++)
{
for (uintptr_t j = start + N*i; j < start + N*i + N; j++)
{
printf(» [%3llu] «, mData.a[j]);
}
puts(«»);
}
for (uintptr_t i = start; i < end ; i++)
sum += mData.a[i];
printf («\tSum = %llu \n», sum);
mData.sum += sum;
sem_post(&sem1);
//Конец критической секции №3

pthread_exit(nullptr);
}

void *createArray(void *arg)
{
uintptr_t offset = reinterpret_cast(arg);
uintptr_t start = offset * mData.length;
uintptr_t end = start + mData.length;

//Критическая секция №1
sem_wait(&sem2);
for (uintptr_t i = start; i < end ; i++)
a[i] = pow((i+1), 1);
int value;
sem_getvalue(&sem2, &value);

while(value != 0)
{
sem_getvalue(&sem2, &value);
}
sleep(1);
//Конец критической секции №1

//Критическая секция №2
sem_wait(&sem1);
sem_getvalue(&sem2, &value);
if ( value == 0 )
{
sem_post(&sem2);
puts(«The array data present:»);
puts(«»);
for (uintptr_t i = 0; i < L ; i++)
{
for (uintptr_t j = i*N; j < i*N + N; j++)
{
printf(» [%3llu] «, mData.a[j]);
}
puts(«»);
}
}
sem_post(&sem1);
//Конец критической секции №2

threadWork(arg);
}

int main ()
{
mData.length = L;
mData.a = a;
mData.sum = 0;

void *status;
sem_init(&sem1, 0, 1);
sem_init(&sem2, 0, N);

for(long i=0; i < N; i++)
pthread_create(&myThread[i], nullptr, createArray, reinterpret_cast<void*>(i));

for(int i=0; i < N; i++)
pthread_join(myThread[i], &status);

printf («\n\tSum = %llu \n», mData.sum);
free (a);

sem_destroy(&sem1);
sem_destroy(&sem2);

return 0;
}

Рассмотрим работу данной процедуры с предпроцессорных и глобальных объявлений.
Создана глобальная структура MyData с тремя полями: *a, length, sum.
В этих атрибутах будут храниться данные с результатами. Для указателя *a выделяется память под L×N элементов типа int. Затем создаются объект этой структуры с идентификатором mData, а также: N переменных потока pthread_t, два семафора: sem1 и sem2.
Рассмотрим работу программы по шагам:
Функция main():
нициализирует данные структуры mData;
Инициализирует семафор sem1 со значением 1;
Инициализирует семафор sem2 со значением N (кол-во потоков);
Создаёт N потоков через цикл for и передаёт их в функцию createArray, с аргументами в виде счётчика для идентификации этих потоков;
С помощью функции pthread_join() дожидается завершения каждого из потоков;
Выводит результат из атрибута mData.sum на стандартный поток вывода;
Освобождает указатель *a;
Уничтожает семафоры sem1, sem2.
Завершается с кодом «0» в случае успеха.
Функция createArray():
Присваивает аргумент потока в переменную offset;
Инициализирует начало и конец для индексирования массива;
Заходит в критическую секцию №1;
В критической секции №1 каждый поток декрементирует семафор sem2 и начинает заполнять свой сегмент массива a;
Получает текущее состояние семафора sem2 с помощью функции sem_getvalue() и заходит в цикл while(), где ожидает прохождения критической секции №1 последним потоком;
Ожидает 1 секунду для большей синхронизации по времени;
Заходит в критическую секцию №2;
В критической секции №2 каждый поток блокирует этот блок кода семафором sem1, который выступает в роли мьютекса;
Получат текущее значение семафора sem2;
Проверяет значение семафора sem2 на нуль и, если это так, то он заходит в блок условия if и вызывает функцию sem_post() для инкремента семафора sem2, чтобы другие потоки не смогли зайти в этот блок;
Этот единственный поток выводит заполненный массив целиком по 5 элементов на строчку, затем выводит пустую строку и освобождает семафор sem1;
Каждый поток так или иначе заходит в критическую секцию №2, но не каждый заходит в блок с условным оператором if, затем освобождает семафор sem1 и выходит из это критической секции;
Далее, каждый поток вызывает функцию threadWork(), где продолжает свою работу.
Функция threadWork():
Присваивает аргумент потока в переменную offset;
Инициализирует начало и конец для индексирования массива;
Заходит в критическую секцию №3 с помощью семафора sem1;
Выводит приветствие в поток вывода;
Выводит свою часть массива на экран;
Вычисляет сумму своих элементов массива;
Выводит сумму своих элементов массива на экран;
Суммирует свою сумму из предыдущего пункта с общей суммой;
Выходит из критической секции №3;
Завершает свою работу с помощью функции pthread_exit().
В результате такого алгоритма заметим следующее:
Семафор sem2 выступает в ролях: барьера в критической секции №1, условной переменной в критической секции №2.
Семафор sem1 выступает в ролях: мьютекса в критических секциях №2 и №3.
Сложнее всего была реализации критической секции №2, так как требовалось обеспечить вывод массива только одним потоком, с тем условием, чтобы другие потоки успели пройти критическую секцию №1, именно для этого используется задержка sleep(1); если бы не эта задержка на 1 секунду, то другой поток мог не успеть выйти из критической секции №1, а может и несколько. Покажем пример каждого случая после корректной работы программы.
Результат работы программы:
Случай 1: задержка на 1 секунду после барьера в критической секции №1 отсутствует.
Потоки №№ 1, 2 и 5 застревают в бесконечном цикле while(), где значение value закрепилось потоками 3 и 4 в ненулевом состоянии.
Случай 2: отсутствие мьютекса перед входом в оператор if.
Никто не дожидается потока 2, другие потоки просто проскакивают мимо!
Вывод:
В результате мы достигли следующего:
Научились работать с потоками в системе Linux, также применили знания для написания программы;
Повторили материал по потокам ввода-вывода, стандартным конструкциям языка C++;

Помощь с дистанционным обучением
Получи бесплатный расчет за 15 минут
 

Введите контактный e-mail:

 

Введите номер телефона

 

Что требуется сделать?

 

Каким способом с Вами связаться?:

E-mail
Телефон
Напишем вам на вашу почту
 
Перезвоним вам для уточнения деталей
 
Перезвоним вам для уточнения деталей
 

или напишите нам прямо сейчас

Написать в WhatsApp
 

Оставить комментарий

 

Ваше имя:

Ваш E-mail:

Ваш комментарий

Inna Petrova 18 минут назад

Нужно пройти преддипломную практику у нескольких предметов написать введение и отчет по практике так де сдать 4 экзамена после практики

Иван, помощь с обучением 25 минут назад

Inna Petrova, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Коля 2 часа назад

Здравствуйте, сколько будет стоить данная работа и как заказать?

Иван, помощь с обучением 2 часа назад

Николай, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Инкогнито 5 часов назад

Сделать презентацию и защитную речь к дипломной работе по теме: Источники права социального обеспечения. Сам диплом готов, пришлю его Вам по запросу!

Иван, помощь с обучением 6 часов назад

Здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Василий 12 часов назад

Здравствуйте. ищу экзаменационные билеты с ответами для прохождения вступительного теста по теме Общая социальная психология на магистратуру в Московский институт психоанализа.

Иван, помощь с обучением 12 часов назад

Василий, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Анна Михайловна 1 день назад

Нужно закрыть предмет «Микроэкономика» за сколько времени и за какую цену сделаете?

Иван, помощь с обучением 1 день назад

Анна Михайловна, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Сергей 1 день назад

Здравствуйте. Нужен отчёт о прохождении практики, специальность Государственное и муниципальное управление. Планирую пройти практику в школе там, где работаю.

Иван, помощь с обучением 1 день назад

Сергей, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Инна 1 день назад

Добрый день! Учусь на 2 курсе по специальности земельно-имущественные отношения. Нужен отчет по учебной практике. Подскажите, пожалуйста, стоимость и сроки выполнения?

Иван, помощь с обучением 1 день назад

Инна, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Студент 2 дня назад

Здравствуйте, у меня сегодня начинается сессия, нужно будет ответить на вопросы по русскому и математике за определенное время онлайн. Сможете помочь? И сколько это будет стоить? Колледж КЭСИ, первый курс.

Иван, помощь с обучением 2 дня назад

Здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Ольга 2 дня назад

Требуется сделать практические задания по математике 40.02.01 Право и организация социального обеспечения семестр 2

Иван, помощь с обучением 2 дня назад

Ольга, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Вика 3 дня назад

сдача сессии по следующим предметам: Этика деловых отношений - Калашников В.Г. Управление соц. развитием организации- Пересада А. В. Документационное обеспечение управления - Рафикова В.М. Управление производительностью труда- Фаизова Э. Ф. Кадровый аудит- Рафикова В. М. Персональный брендинг - Фаизова Э. Ф. Эргономика труда- Калашников В. Г.

Иван, помощь с обучением 3 дня назад

Вика, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Игорь Валерьевич 3 дня назад

здравствуйте. помогите пройти итоговый тест по теме Обновление содержания образования: изменения организации и осуществления образовательной деятельности в соответствии с ФГОС НОО

Иван, помощь с обучением 3 дня назад

Игорь Валерьевич, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Вадим 4 дня назад

Пройти 7 тестов в личном кабинете. Сооружения и эксплуатация газонефтипровод и хранилищ

Иван, помощь с обучением 4 дня назад

Вадим, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Кирилл 4 дня назад

Здравствуйте! Нашел у вас на сайте задачу, какая мне необходима, можно узнать стоимость?

Иван, помощь с обучением 4 дня назад

Кирилл, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Oleg 4 дня назад

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

Иван, помощь с обучением 4 дня назад

Oleg, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Валерия 5 дней назад

ЗДРАВСТВУЙТЕ. СКАЖИТЕ МОЖЕТЕ ЛИ ВЫ ПОМОЧЬ С ВЫПОЛНЕНИЕМ практики и ВКР по банку ВТБ. ответьте пожалуйста если можно побыстрее , а то просто уже вся на нервяке из-за этой учебы. и сколько это будет стоить?

Иван, помощь с обучением 5 дней назад

Валерия, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Инкогнито 5 дней назад

Здравствуйте. Нужны ответы на вопросы для экзамена. Направление - Пожарная безопасность.

Иван, помощь с обучением 5 дней назад

Здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Иван неделю назад

Защита дипломной дистанционно, "Синергия", Направленность (профиль) Информационные системы и технологии, Бакалавр, тема: «Автоматизация приема и анализа заявок технической поддержки

Иван, помощь с обучением неделю назад

Иван, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Дарья неделю назад

Необходимо написать дипломную работу на тему: «Разработка проекта внедрения CRM-системы. + презентацию (слайды) для предзащиты ВКР. Презентация должна быть в формате PDF или формате файлов PowerPoint! Институт ТГУ Росдистант. Предыдущий исполнитель написал ВКР, но работа не прошла по антиплагиату. Предыдущий исполнитель пропал и не отвечает. Есть его работа, которую нужно исправить, либо переписать с нуля.

Иван, помощь с обучением неделю назад

Дарья, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru