Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2017, 20:59   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Примитивы синхронизации

Какие есть средства синхронизации в C++ кроме std::mutex? Где в STL критические секции и семафоры?

Еще в C++ есть способ синхронизировать потоки без примитивов синхронизации. Что это за способ?
Aoizora вне форума Ответить с цитированием
Старый 23.08.2017, 21:30   #2
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

recursive_mutex, shared_mutex (c++17), atomic, memory order.

Цитата:
Сообщение от Aoizora Посмотреть сообщение
Что это за способ?
free lock?
Тогда Вам глубоко в архитектуру процессоров сначала.
Croessmah вне форума Ответить с цитированием
Старый 23.08.2017, 21:40   #3
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

А фрилок это что? Что-то типа спинлока или немного выше?
Aoizora вне форума Ответить с цитированием
Старый 23.08.2017, 22:31   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Aoizora Посмотреть сообщение
Где в STL критические секции и семафоры
Их нет.
STL должен работать на всех платформах а критические секции - сугубо виндовые.
Отсуствия семафоров я лично даже не заметил
За столько лет практики ни разу не требовались, но если очень нужно, можно собрать свой семафор на основе mutex и condition_variable.
waleri вне форума Ответить с цитированием
Старый 24.08.2017, 20:59   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Aoizora Посмотреть сообщение
Какие есть средства синхронизации в C++ кроме std::mutex? Где в STL критические секции и семафоры?
есть ещё рекурсивные мутексы, кондишен-вариэйбл.
которые позволяют по всякому кастомизировать
стратегию синхронизации.

кроме того доступна механика для работы с моделью памяти.
можно легко слепить кастомный спинлок,
или критическую секцию.

Цитата:
Сообщение от Aoizora Посмотреть сообщение
Еще в C++ есть способ синхронизировать потоки без примитивов синхронизации. Что это за способ?
да. есть.
с++ предоставляет возможность работать с моделью памяти.
но это очень сложная и объёмная тема.
https://habrahabr.ru/post/195770/
_Bers вне форума Ответить с цитированием
Старый 24.08.2017, 22:23   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Мои скромные мысли по этим делам.

Цитата:
Сообщение от _Bers Посмотреть сообщение
есть ещё рекурсивные мутексы, кондишен-вариэйбл.
Примитивами их трудно назвать, скорее это производные.

Цитата:
Сообщение от waleri Посмотреть сообщение
а критические секции - сугубо виндовые
Несогласен. критические секции это такой же примитив синхронизации. И он есть не только в виндоусе.
Есть примитивы синхронизации по коду, есть по данным. Одни можно реализовать через другие. Так что получается что-то вроде синтаксического сахара.
В учебнике обычно рассматривают spin-lock, затем мьютекс. А на критическую секцию попросту забивают.

Цитата:
Сообщение от _Bers Посмотреть сообщение
работать с моделью памяти.
Это тоже блокировка. Что приводит к тем же барьерами синхронизации. Просто в отличии от обычного кода этот барьер реализован либо аппаратно либо в ядре ОС.

А теперь по поводу фрилоков. Брехня. Не то что-бы 100%.
Любая синхронизация основана на задержках. "Синхро" от слово время. Даже атомарные операции проседают по времени в разы если обращаются к общей памяти.
А теперь про то, как сделать без запоров.
- Способ первый конвейерная обработка.
Это не структура. Это способ организации вычислений. А во вторых процессор работает не детерминировано и ОС тоже. Поэтому фазы потоков будут непременно сбиваться. Что потребует синхронизации.
- Способ второй найдя на барьер. Начинаем выполнять другую задачу. Но блокировка никуда не делась! Просто процессор занять полезным делом.
По сути тежи яйца только вид сбоку. Всё ещё возможны дедлоки.
-Способ третий организационный. Организовать процесс как в армии командир распределяет задачи. Он же проверяет их исполнение. Без разрешения командира подчинённые не писать не читать не могут. Смерельные блокировки исключены в принципе. Но командир опрашивает подчинённых с некоторой периодичностью, отсюда к стати и задержки с синхронизацией. Просто маскируются на более высоком уровне. От чего и и не видно.

Так всё же есть структуры без блокировок? Да есть.
1) Версионная структура данных.
Каждый поток работает со своей версией структуры. Физически структура одна, но для потоков они выглядят как разные. Версии структуры связана временем доступа.

Частичная избыточность данных, дополнительные расходы для хранения версии. Синхронизации и там есть, только она занимает минимум времени и спокойно реализуется на атомарных операциях без спинлоков.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 24.08.2017, 22:35   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Хотя если за счёт дублирования данных реализовать поддержку версионности на аппаратно. И отслеживать время жизни данных через регионы, то можно разработать новые структуры данных.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 24.08.2017, 23:14   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Это тоже блокировка. Что приводит к тем же барьерами синхронизации. Просто в отличии от обычного кода этот барьер реализован либо аппаратно либо в ядре ОС.
нет там никакой блокировки.
лок фри оперирует атомарными операциями,
вокруг которых выстраиваются различные CAS
https://habrahabr.ru/post/195948/

барьеры памяти вообще не имеют никакого отношения к примитивам синхронизации.
и нужны для упорядочивания и оптимизации обращений к памяти
разными ядрышками CPU
https://habrahabr.ru/post/196548/
_Bers вне форума Ответить с цитированием
Старый 24.08.2017, 23:28   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
нет там никакой блокировки.
лок фри оперирует атомарными операциями,
вокруг которых выстраиваются различные CAS
https://habrahabr.ru/post/195948/

барьеры памяти вообще не имеют никакого отношения к примитивам синхронизации.
и нужны для упорядочивания и оптимизации обращений к памяти
разными ядрышками CPU
https://habrahabr.ru/post/196548/
Открываем статью.
Код:
int FAA( int * pAddr, int nIncr )
{
     int ncur ;
     do {
          ncur = *pAddr ;
     } while ( !CAS( pAddr, ncur, ncur + nIncr ) ;  
     return ncur ;
}
То что жирным называется Spin-lock. Дальше статью я так понимаю читать нет смысла. Они вас обманывают.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 24.08.2017 в 23:50.
Pavia вне форума Ответить с цитированием
Старый 25.08.2017, 11:35   #10
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Pavia, цикл выше не блокирует поток,
поток не встал, и по прежнему работает.
Ожидание в цикле != блокировка.
Другое дело, что у нас есть деление
на obstruction-free, lock-free и wait-free.

Последний раз редактировалось Croessmah; 25.08.2017 в 11:42.
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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