Главная » Просмотр файлов » А. Александреску - Современное проектирование на C++

А. Александреску - Современное проектирование на C++ (1119444), страница 77

Файл №1119444 А. Александреску - Современное проектирование на C++ (А. Александреску - Современное проектирование на C++) 77 страницаА. Александреску - Современное проектирование на C++ (1119444) страница 772019-05-09СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 77)

Неорганизованный доступ потоков к данным также может стать причиной потери информации. В однопоточном программировании безопасность данных при входе и выходе функции обычно гарантируется. Например, оператор присваивания (орегатог=) из класса 5тгзпа считает объект класса 5тг(па корректным только перед началом и по- 320 Приложение еле завершения операции. В многопоточном программировании необходимо обеспечивать корректность объекта класса 5тг(пц даже во время выполнения оператора присваивания, поскольку другой поток может прервать выполнение этого оператора и применить к этому объекту другую операцию. В то время как однопоточное программирование приучает программистов рассматривать функции как атомарные операции, в многопоточном программировании необходимо самому указывать, какие операции являются атомарными.

Итак, многопоточные программы порождают большие проблемы при совместном использовании данных, что следует считать их недостатком. Большинство способов многопоточного программирсвания основное внимание уделяюг обаеклгам сиохролизадии (сгпс)ггопиаг(оп оЬ)есгз), позволяющим обеспечивать последовательный доступ к совместно используемым ресурсам. При выполнении атомарной операции объект синхронизации захватывается. Если другие потоки пытаются захватить тот же объект синхронизации, они фиксируются. Затем данные изменяются, и объект синхронизации освобождается. В этот момент его может захватить другой поток, получив доступ к данным.

Таким обраюм, потоки всегда работают с корректными данными. В следующем разделе будут описаны разные способы захвата. Их перечень не исчерпывается объектами синхронизации, хотя эти объекты позволяют решить большинство задач многопоточного программирования. П.2. Подход, реализованный в библиотеке ~.ок1 Для решения проблем, связанных с многопоточностью, в библиотеке 1о)г1 опрелелена стратегия тЬгеа6(пцмобе1.

Эта стратегия представляет собой шаблонный класс с одним аргументом. Такой аргумент является типом языка С++, дяя которого реализуются функциональные возможности многопоточного программирования. тевр1ате <турепаве т> с1ааа 5овет)ггеа6зпцво6е! В следующих разделах мы последовательно раскроем содержание стратегии тпгеа6зпцмо6е1.

В библиотеке Еорб определена однопоточная модель, которая в большинстве случаев используется по умолчанию. П.З. Атомарные операции с целочисленными типами Допустим, что переменная х имеет тип 1пт. Рассмотрим оператор ++х; Может показаться странным, что мы уделяем время анализу простого оператора инкрементации, однако именно в таких ситуациях проявляются особенности многопоточного программирования — для решения простых проблем нужно приложить много усилий. Чтобы увеличить значение переменной х на единицу, процессор выполняет три операции. 1.

Извлекает переменную из памяти. 2. Увеличивает значение переменной в арифметико-логическом устройстве (АЛУ) процессора. Это единственное место, где выполняются операции — в памяти данных они лишь хранятся. 3. Переменная записывается обратно в память. 321 Многопоточная библиотека в стило минимализма Поскольку первая операция считывает, вторая — модифицирует, а третья — записывает данные, они образуют тройку, известнуто по названием оаерация чтения- модификации-записи (геад-глод!(у-ът!ге орегагюп — ВМ%). Предположим теперь, что оператор инкрементации выполняется в компьютере с многопроцессорной архитектурой. Для того чтобы достичь максимального аффекта во время модификации данных в процессе выполнения операции чтения-модификации- записи, процессор освобождает шину запоминаюшего устройства. Таким образом, второй процессор получает доступ к памяти, пока первый выполняет операцию инкрементации.

Это позволяет зффективнее использовать ресурсы. К сожалению, другой процессор может применить операцию чтения-модификации- записи к той же переменной. Например, допустим, что существуют два оператора инкременгации переменной х, которая в начальный момент времени имеет значение О, и зги операторы выполняются двумя процессорами Р! и Р2 в такой последовательности. 1. Процессор Р! захватывает шину запоминаюшего устройства и извлекает переменную х.

2. Процессор Р1 освобождает шину запоминаюшего устройства. 3. Процессор Р2 захватывает шину запоминаюшего устройства и извлекает переменную х (значение которой по-прежнему равно О). В то же время процессор Р! увеличивает значение переменной х на единицу в своем арифметикологическом устройстве. Результат равен 1.

4. Процессор Р2 освобождает шину запоминаюшего устройства. 5. Процессор Р1 захватывает шину запоминающего устройства и записывает значение 1 в переменную х. Одновременно процессор Р2 увеличивает значение переменной х на единицу в своем арифметика-логическом устройстве. Поскольку процессор Р2 извлек значение О, результат снова равен 1. 6. Процессор Р2 освобождает шину запоминающего устройства.

7. Процессор Р2 захватывает шину запоминаюшего устройства и записывает значение 1 в переменную х. 8. Процессор Р2 освобождает шину запоминаюшего устройства. В итоге, хотя к переменной х были применены две операции инкрементации, ее значение станет равным 1, а не 2. Это неверный результат, причем ни один процессор (поток) не сможет распознать, что операция инкрементации была выполнена неверно. В многопоточной среде ничто не является атомарным — даже простая операция инкрементации целого числа. Есть множество способов сделать операцию инкрементации атомарной. Наиболее аффективный из них — использовать возможности процессора.

Некоторые процессоры предоставляют возможности блокировки шины запоминающего устройства — операция чтения-модификации-записи выполняется как и раньше, однако во время ее выполнения шина запоминаюшего устройства остается заблокированной. Таким образом, процессор Р2 извлекает переменную х из памяти только после того, как процессор Р! выполнит свою операцию инкрементации. Эта низкоуровневая функциональная возможность реализуется операционной системой с помошью функций на языке С, используюших атомарные операции инкрементации и декрементации. 322 Приложвнив Обычно операционные системы опрелеляют атомарные операции лля целочисленных типов, размер которых совпадает с шириной шины запоминающего устройства — в боль- шинстве случаев это тип 1пт.

Потоковая подсистема библиотеки ЕоИ (файл т)згеаг(з,'и) определяет тип тпттуре внутри каждой реализации стратегии тогеадз пдмоде1. Элементарные функции, выполняющие атомарные операции„определенные в стратегии т(згеаг(тпдмоде1, имеют следующий вид, тевр1ате ктурепаве т> с1азэ 5овет(згеаНпдмоде1 ( риЫзс: туреде1 зпт дохтуре; // или другой тип в зависимости от платформы зтатз с хпттуре лтовз сддд(мо1атз 1е тпттурев 1ма1, тпттуре ча1); этатзс тпттуре дтовзсвиЬтгаст(чо1атз1е тпттурев 1ча1, тпттуре ка1); аналогичные определения для функций дтов(сми1тзр1у, лтов(созИде, дтовзстпсгевепт и дтовз сресгевепт зтатз с чоз'г) дтовзсдззздп(чо1атз 1е тпттурев 1ча1, тпттуре ча1); зтатзс чо)д лтовзсдззздп(тпттуреб 1ча1, чо1ат)1е тпттурее ча1) Эти элементарные функции получают изменяемое значение в качестве первого параметра (обратите внимание на то, что они передаются по неконстантной ссылке с помощью типа чо1атз1е), а второй операнд (отсутствующий в случае унарных операторов) передается в качестве второго параметра.

Каждая элементарная функция возвращает копию параметра типа чо1атз1е, Это очень полезно, поскольку позволяет контролировать фактический результат выполнения операции. рассмотрим ситуацию, при которой переменная типа чо1ат11е проверяется после выполнения операции. чо1атз1е з'пт сомптег; 5оветпгеаН пдмоде1<изддет>::дтовзслгЫ(соцптег, 5); т'Р (сомптег == 10) В этом случае код не проверяет переменную соиптег сразу после сложения, поскольку другой поток может модифицировать ее в интервале между вызовами функции Атов1сА<Ы и оператором 5 Г. Чаше всего проверять значение переменной соипсег необходимо сразу после вызова функции дтовз' слдд.

Для этого достаточно написать следующий код. зЕ (дтов1слг)д(сомптег, 5) == 10) Наличие двух разных функций дтоИ слэзт'дп необходимо, поскольку даже операция копирования может быль не атомарной, Например, если ширина шины компьютера равна 32 бит, а тип 1опд имеет размер 64 бит, для копирования переменной типа 1опд понадобится дважды обращаться к памяти. П.4. Мьютексы Эдгар Дийкстра (Едваг ))1)1згга) доказал, что в многопоточной среде планировшик потоков операционной системы должен содержать определенные объекты синхронизации.

Без них написать правильное многопоточное приложение невозможно. Мьютексы представляют собой основные объекты синхронизации, позволяющие потокам получать доступ к совместно используемым ресурсам в организованном порядке. В этом разделе дается определение мьютекса. В остальной части библиотеки ЕоМ мьютексы непосредственно не используются. Вместо этого в ней определяются высокоуровневые средства синхронизации, которые легко реалиювать с помощью мьютексов. 323 Многопоточная библиотека в стиле минимализма Мьюллехс (пппех) — это аббревиатура слов Мщца! Ехс(ца(те (взаимоисключающий), которые определяют способ функционирования этого объекта.

Мьютекс предоставляет потокам взаимоисключающий доступ к ресурсу. Основными функциями мьютекса являются функции асцц! ге и яе1еаае. Каждый поток, которому необходим исключительный доступ к ресурсу (например, к совместно используемой переменной), завладевает мьютексом. Только один поток может владеть мьютексом. После того как поток завладел мьютексом, остальные потоки, вызывающие функцию Асцц! ге, переводятся в состояние ожидания (функция дсцЫ ге ничего не возвращает). Когда поток, владеющий мьютексом, вызывает функцию яе1еазе, планировщик потоков выбирает один из ожидающих потоков и передает право владения мьютексом ему. Итак, мьютекс выступает в роли устройства последовательного доступа: часть кода между вызовом функции втх .дсцц! геО и вызовом функции втх .ае1еаэеО является атомарной по отношению к объекту втх .

Характеристики

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6479
Авторов
на СтудИзбе
303
Средний доход
с одного платного файла
Обучение Подробнее