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

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

Автор статьи
Валерия
Валерия
Наши авторы
Эксперт по сдаче вступительных испытаний в ВУЗах
Лабораторная Работа №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++;

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

Написать в WhatsApp Написать в Telegram

О сайте
Ссылка на первоисточник:
http://www.cross-apk.ru
Поделитесь в соцсетях:

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

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