Одновременный доступ к ресурсам 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Одновременный доступ к ресурсам



В вышеприведенном примере для печати на экран использовался 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; просмотров: 561; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.36.141 (0.008 с.)