![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
![]()
Какие есть средства синхронизации в C++ кроме std::mutex? Где в STL критические секции и семафоры?
Еще в C++ есть способ синхронизировать потоки без примитивов синхронизации. Что это за способ? |
![]() |
![]() |
![]() |
#2 |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
![]() |
![]() |
![]() |
![]() |
#3 |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
![]()
А фрилок это что? Что-то типа спинлока или немного выше?
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,447
|
![]()
Их нет.
STL должен работать на всех платформах а критические секции - сугубо виндовые. Отсуствия семафоров я лично даже не заметил ![]() За столько лет практики ни разу не требовались, но если очень нужно, можно собрать свой семафор на основе mutex и condition_variable. |
![]() |
![]() |
![]() |
#5 | ||
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
которые позволяют по всякому кастомизировать стратегию синхронизации. кроме того доступна механика для работы с моделью памяти. можно легко слепить кастомный спинлок, или критическую секцию. Цитата:
с++ предоставляет возможность работать с моделью памяти. но это очень сложная и объёмная тема. https://habrahabr.ru/post/195770/ |
||
![]() |
![]() |
![]() |
#6 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,408
|
![]()
Мои скромные мысли по этим делам.
Примитивами их трудно назвать, скорее это производные. Несогласен. критические секции это такой же примитив синхронизации. И он есть не только в виндоусе. Есть примитивы синхронизации по коду, есть по данным. Одни можно реализовать через другие. Так что получается что-то вроде синтаксического сахара. В учебнике обычно рассматривают spin-lock, затем мьютекс. А на критическую секцию попросту забивают. Это тоже блокировка. Что приводит к тем же барьерами синхронизации. Просто в отличии от обычного кода этот барьер реализован либо аппаратно либо в ядре ОС. А теперь по поводу фрилоков. Брехня. Не то что-бы 100%. Любая синхронизация основана на задержках. "Синхро" от слово время. Даже атомарные операции проседают по времени в разы если обращаются к общей памяти. А теперь про то, как сделать без запоров. - Способ первый конвейерная обработка. Это не структура. Это способ организации вычислений. А во вторых процессор работает не детерминировано и ОС тоже. Поэтому фазы потоков будут непременно сбиваться. Что потребует синхронизации. - Способ второй найдя на барьер. Начинаем выполнять другую задачу. Но блокировка никуда не делась! Просто процессор занять полезным делом. По сути тежи яйца только вид сбоку. Всё ещё возможны дедлоки. -Способ третий организационный. Организовать процесс как в армии командир распределяет задачи. Он же проверяет их исполнение. Без разрешения командира подчинённые не писать не читать не могут. Смерельные блокировки исключены в принципе. Но командир опрашивает подчинённых с некоторой периодичностью, отсюда к стати и задержки с синхронизацией. Просто маскируются на более высоком уровне. От чего и и не видно. Так всё же есть структуры без блокировок? Да есть. 1) Версионная структура данных. Каждый поток работает со своей версией структуры. Физически структура одна, но для потоков они выглядят как разные. Версии структуры связана временем доступа. Частичная избыточность данных, дополнительные расходы для хранения версии. Синхронизации и там есть, только она занимает минимум времени и спокойно реализуется на атомарных операциях без спинлоков.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
![]() |
![]() |
![]() |
#7 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,408
|
![]()
Хотя если за счёт дублирования данных реализовать поддержку версионности на аппаратно. И отслеживать время жизни данных через регионы, то можно разработать новые структуры данных.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
![]() |
![]() |
![]() |
#8 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
лок фри оперирует атомарными операциями, вокруг которых выстраиваются различные CAS https://habrahabr.ru/post/195948/ барьеры памяти вообще не имеют никакого отношения к примитивам синхронизации. и нужны для упорядочивания и оптимизации обращений к памяти разными ядрышками CPU https://habrahabr.ru/post/196548/ |
|
![]() |
![]() |
![]() |
#9 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,408
|
![]() Цитата:
Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 24.08.2017 в 23:50. |
|
![]() |
![]() |
![]() |
#10 |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
![]()
Pavia, цикл выше не блокирует поток,
поток не встал, и по прежнему работает. Ожидание в цикле != блокировка. Другое дело, что у нас есть деление на obstruction-free, lock-free и wait-free. Последний раз редактировалось Croessmah; 25.08.2017 в 11:42. |
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Система классов, графические примитивы и операции над множествами | FatSlowpoke | Общие вопросы C/C++ | 4 | 29.05.2015 22:46 |
графические примитивы | Zaraaa | Помощь студентам | 8 | 18.09.2014 09:17 |
графические примитивы | Zaraaa | Помощь студентам | 2 | 15.09.2014 09:23 |
Создать граф. примитивы | vibraxo | Помощь студентам | 18 | 06.06.2013 23:53 |
Графические примитивы(паскаль) | aslanbek999 | Помощь студентам | 1 | 03.06.2009 19:53 |