![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Одновременный доступ к ресурсамСодержание книги
Поиск на нашем сайте
В вышеприведенном примере для печати на экран использовался sstream, предварительно превращая в строку то что хочу печатать а потом передаю в поток вывода. А что если сразу передать в поток вывода, сперва первую строку, потом переменную типа thread::id и наконец вторую строку. Но в этом случае потоки не по очереди будут передавать в поток вывода и в итоге получается совсем не то что мы хотели. Такая ситуация бывает когда несколько потоков работают с одним и тем же объектом. Для того чтобы предотвратить это воспользуемся классом mutex который определен в файле mutex. Переменная типа mutex можно блокировать и разблокировать. Когда вызывается метод lock класса mutex, метод проверяет объект и если он разблокирован то блокирует его и возвращает выполнение, в противном случае оно ждет пока объект разблокируется и после чего делает то же самое. А метод unlock разблокирует объект класса mutex этим позволяя другим процессам его блокировать. #include<iostream> #include<cstdlib> #include<vector> #include<mutex> #include<thread> using namespace std; const int elementsCount = 10; void push(vector<int> &arr, mutex& m_arr, mutex& m_out) { int num; for (int i = 0; i < elementsCount; i++) { m_arr.lock(); num = rand(); arr.push_back(num); m_arr.unlock(); m_out.lock(); cout << "Push " << num << "\n"; m_out.unlock(); } }
void pop(vector<int> &arr, mutex& m_arr, mutex& m_out) { int i = 0, num; while (i < elementsCount) { m_arr.lock(); if (arr.size() > 0) { num = arr.back(); arr.pop_back(); m_out.lock(); cout << "Pop " << num << "\n"; m_out.unlock(); i++; } m_arr.unlock(); } }
int main() { mutex m_arr, m_out; vector<int> vec; thread push_thread(push, ref(vec), ref(m_arr), ref(m_out)); thread pop_thread(pop, ref(vec), ref(m_arr), ref(m_out)); if (push_thread.joinable()) push_thread.join(); if (pop_thread.joinable()) pop_thread.join(); return 0; } В вышеприведенной программе мы создаем два объекта класса thread первый инициализируем функцией push, который добавляет в вектор 10 элементов блокируя и разблокируя объекты m_arr и m_out, а второй функцией pop, который удаляет 10 элементов из вектора, конечно опять блокируя и разблокируя объекты m_arr и m_out. Источник http://www.cplusplus.com/reference/multithreading/.
Лабораторная работа № 20. Многопоточное программирование. Цель работы: Овладеть навыками разработки многопоточных приложений. Контрольные вопросы 1) Поток. 2) Процессы 3) ID потока 4) Пространство имен this_thread Варианты заданий 1. Даны последовательности символов А = {а0…аn–1} и С = {с0…ск–1}. В общем случае n ≠ k. Создать многопоточное приложение, определяющее, совпадают ли посимвольно строки А и С. Количество потоков является входным параметром программы, количество символов в строках может быть не кратно количеству потоков.
2. Дана последовательность символов С = {с0…сn–1}. Дан набор из N пар кодирующих символов (ai,bi). Создать многопоточное приложение, кодирующее строку С следующим образом: поток 0 заменяет в строке C все символы a0 на символы b0, поток 1 заменяет в строке C все символы a1 на символы b1, и т.д. Потоки должны осуществлять кодирование последовательно. 3. Дана последовательность символов С = {с0…сn–1}. Дан набор из N пар кодирующих символов (ai,bi), т.е. все символы строки ai заменяются на bi. Создать многопоточное приложение, кодирующее строку С следующим образом: строка разделяется на подстроки и каждый поток осуществляет кодирование своей подстроки. Количество символов с последовательности, количество кодирующих пар и потоков являются входными параметрами программы, количество символов в строке может быть не кратно количеству потоков. 4. Дана последовательность символов С = {с0…сn–1} и символ b. Создать многопоточное приложение для определения количество вхождений символа b в строку C. Количество потоков является входным параметром программы, количество символов в строке может быть не кратно количеству потоков. 5. Дана последовательность натуральных чисел {a0…an–1}. Создать многопоточное приложение для поиска суммы ∑ai. Количество потоков является входным параметром программы, потоки проводят вычисления независимо друг от друга, количество символов в строке может быть не кратно количеству потоков. 6. Дана последовательность натуральных чисел {a0…an–1}. Создать многопоточное приложение для поиска произведения чисел a0*а1*…*an–1. Количество потоков является входным параметром программы, потоки проводят вычисления независимо друг от друга, количество символов в строке может быть не кратно количеству потоков. 7. Дана последовательность натуральных чисел {a0…an–1}. Создать многопоточное приложение для поиска максимального ai. Количество потоков является входным параметром программы, потоки проводят вычисления независимо друг от друга, количество символов в строке может быть не кратно количеству потоков.
8. Дана последовательность натуральных чисел {a0…an–1}. Создать многопоточное приложение для поиска минимального ai. Количество потоков является входным параметром программы, потоки проводят вычисления независимо друг от друга, количество символов в строке может быть не кратно количеству потоков. 9. Дана последовательность натуральных чисел {a0…an–1}. Создать многопоточное приложение для поиска всех ai, являющихся простыми числами. Количество потоков является входным параметром программы, потоки проводят вычисления независимо друг от друга, количество символов в строке может быть не кратно количеству потоков. 10. Дана последовательность натуральных чисел {a0…an–1}. Создать многопоточное приложение для поиска всех ai, являющихся квадратами, любого натурального числа. 11. Дана последовательность натуральных чисел {a0…an–1}. Создать многопоточное приложение для вычисления выражения a0-а1+a2-а3+a4-а5+... 12. Дана последовательность натуральных чисел {a0…an–1}. Создать многопоточное приложение для поиска суммы ∑ai, где ai – четные числа. 13. Изготовление знаменитого самурайского меча – катаны происходит в три этапа. Сначала младший ученик мастера выковывает заготовку будущего меча. Затем старший ученик мастера закаливает меч в трех водах – кипящей, студеной и теплой. И в конце мастер собственноручно изготавливает рукоять меча и наносит узоры. Требуется создать многопоточное приложение, в котором мастер и его ученики представлены разными потоками. Изготовление меча представить в виде разных арифметических операций над глобальной переменной. 14. Изготовление знаменитого самурайского меча – катаны происходит в три этапа. Сначала младший ученик мастера выковывает заготовку будущего меча. Затем старший ученик мастера закаливает меч в трех водах – кипящей, студеной и теплой. И в конце мастер собственноручно изготавливает рукоять меча и наносит узоры. Требуется создать многопоточное приложение, в котором мастер и его ученики представлены одинаковыми потоками (обработка производится в цикле). Изготовление меча представить в виде разных арифметических операций над глобальной переменной. 15. Командиру N-ской ВЧ полковнику Кузнецову требуется перемножить два секретных числа. Полковник Кузнецов вызывает дежурного по части лейтенанта Смирнова и требует в течение получаса предоставить ему ответ. Лейтенант Смирнов будит старшего по караулу сержанта Петрова и приказывает ему в 15 минут предоставить ответ. Сержант Петров вызывает к себе рядового Иванова, бывшего студента СФУ, и поручает ему ответственное задание по определению произведения. Рядовой Иванов успешно справляется с поставленной задачей и ответ по цепочке передается полковнику Кузнецову. Требуется создать многопоточное приложение, в котором все военнослужащие от полковника до рядового моделируются потоками одного вида.
Содержание отчета 1. Титульный лист. 2. Наименование и цель работы. 3. Краткое теоретическое описание. 4. Задание на лабораторную работу. 5. Схема алгоритма. 6. Листинг программы. 7. Результаты выполнения программы.
Механизмы синхронизации
|
||||||
Последнее изменение этой страницы: 2016-12-11; просмотров: 604; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.185.214 (0.007 с.) |