Constantine
я честно говоря не изучал
Constantine
но чета я уверен что мутекс первым делом сделает атомарную проверку
Aidar
Если wait делает ось
Aidar
А невейт это один обмен со сравнением
Constantine
Wait дольше чем неwait
wait не дольше чем не-wait потому что ты буквально выразил свое пожелание
Constantine
в случае lock-free ты пошел делать мусорные операции в случае wait ты сказал "мне нужен вот этот ресурс"
Constantine
кажется, второе чуть более optimization friendly
Aidar
В случае wait ты начал ждать вместо мусорных операций но скорее всего переключишь контекс
Constantine
Мы не говорим о реализации wait
Aidar
Для невейт переключение контекста на многоядерной штуке врятли будет
Aidar
Мы не говорим о реализации wait
Я чото уверен что wait на винде будет вызовом винапи типа waitforsingleobject
Constantine
Принципиально ты можешь вызвать nonnative_wait который будет перечитывать до посинения
Constantine
Собственно говоря ты это и делаешь
Aidar
Собственно внутри ты напишешь локфри?
Berkus
а какой профит от lock free кроме понтов, если не перформанс
нет, lock-free очереь в общем случае МЕНЕЕ производительна
Berkus
она используется когда надо гарантировать взаимный прогресс многих продьюсеров или консьюмеров
Constantine
она используется когда надо гарантировать взаимный прогресс многих продьюсеров или консьюмеров
я плохо понимаю, почему это не может быть реализовано системой на уровне if (wait_on_owned_by_other_instance()) transfer_execution_to_that_instance()
Constantine
потому что локфри вообще к системе не обращается
почему это не может быть гарантировано на уровне std::thread?
Berkus
почему это не может быть гарантировано на уровне std::thread?
потому что тред вообще никакого отношения к этому не имеет
Aidar
Ну локфри ещё и труднее контролировать осью, почти гарантировано жрется процессорное время ну и говернор соответственно увеличит частоту
Constantine
потому что тред вообще никакого отношения к этому не имеет
кажется, у mutex-подобных объектов завязки с thread очень жесткие
Berkus
кажется, у mutex-подобных объектов завязки с thread очень жесткие
вот именно, а в лок фри ни одного такого объекта не используется. бинго
Berkus
да это Константин опять страдает хуетой которую не понимает
Berkus
в большинстве случаев (100-102%) это так
Constantine
Почему? Это замечательное упражнение по программированию
Berkus
понятно что на всех человеческих системах мьютексы используют фаст лок и хэппи путь там стремительный как один атомик
Berkus
Почему? Это замечательное упражнение по программированию
я думаю илья имеет в виду практическое применение, не олимпиадное
Constantine
я думаю илья имеет в виду практическое применение, не олимпиадное
практическое применение упражнения по программированию имеют)
Constantine
Ну ладно, я уже придумал чудесный пример, зачем нужен lock free - привет, Real Time гарантия
Constantine
Ну собственно речь про RealTime гарантию
Constantine
Или как она называется там
Constantine
Грубо говоря гарантия, что метод будет исполнен в не более, чем _число_ тактов
Эрсултан
Вроде проходили что такое массив как заполнять и как выводить и т.п. но вот такое как записала училка... незнаю крч (
Эрсултан
Эрсултан, параллельные массивы — это такой антипаттерн программирования, специально чтобы так не делать, придумали СТРУКТУРЫ, (они же мини-объекты) Если проходили, то используй массив структур тут.
Constantine
lock-free не дает real-time гарантий никаких
в случае с очередью дает O(числа параллельных вызовов), видимо
Олександр
Повторить значит
А еще в @supapro
Berkus
в случае с очередью дает O(числа параллельных вызовов), видимо
он дает гарантию что _когда-нибудь_ ты сможешь в эту очередь записать, но не гарантирует _когда_
Berkus
и с чтением такая же фигня
Эрсултан
А еще в @supapro
Я вступил вообще то чтобы учиться тут просматривая решение проблем других и сам развиваться...
Berkus
гарантирует, если чтений/записей ограничено
если ограничено то и мьютекс тебе такое позволяет
Berkus
но еще раз - лок-фри не означает реал-тайм
Эрсултан
Спасибо огромное
Berkus
гарантирует, если чтений/записей ограничено
https://stackoverflow.com/a/5680988/6804187 собственно, раз ты мне не веришь - вся польза лок-фри в переизобретении синхронизации минуя системные вызовы)
Constantine
если ограничено то и мьютекс тебе такое позволяет
в real time у тебя просто нет мьютексов :)
🐙 Antony
Мьютексы это неявная секвеншнал консистенс с инвалидацией всего кэша
Мьютексы по стандарту обладают acquire семантикой в lock() и release в unlock() Так что никакой seq_cst там нет
🐙 Antony
кажется, у mutex-подобных объектов завязки с thread очень жесткие
Никаких жёстких связок в стандарте между std::thread и std::mutex мной не обнаружено
🐙 Antony
нет, lock-free очереь в общем случае МЕНЕЕ производительна
+1. Правильно написанный код с мьютексами как правило производительнее чем lock-free подход. Это не только моё мнение, см CppCon2016, там один из докладчиков говорил что lock-free в большинстве тестов быстрее, потому что сравнивается с убогим решением на мьютексах (с динамической аллокацией в критической секции)
Berkus
в real time у тебя просто нет мьютексов :)
вовсе нет, могут быть и мьютексы, реал тайм это всего лишь выполнение действия за предерменированное время - но оно может быть сколько угодно большим)
Constantine
Никаких жёстких связок в стандарте между std::thread и std::mutex мной не обнаружено
Как минимум сразу: если std::mutex дважды lock() одним и тем же thread, то behavior is undefined
Aleksander
Как минимум сразу: если std::mutex дважды lock() одним и тем же thread, то behavior is undefined
для этого есть рекурсивные мьютексы. Костыльность не отменяет, но есть.
Anton
все там defined, грохнется сразу )
Berkus
Как минимум сразу: если std::mutex дважды lock() одним и тем же thread, то behavior is undefined
это проблемы стандарта, любят они UB понапихать ради скорости
Anton
в msvc и gcc точно
🐙 Antony
Как минимум сразу: если std::mutex дважды lock() одним и тем же thread, то behavior is undefined
У вас то же самое будет с атомарным спинлоком. Получается что ваш cпинлок жёстко связан с std::thread?
Constantine
У вас то же самое будет с атомарным спинлоком. Получается что ваш cпинлок жёстко связан с std::thread?
Как минимум std::thread что-то гарантирует по поводу работы многопоточной системы
Anton
деадлок на спинлоках вообще песня :)
Anton
зачастую только кнопка ресет спасает :)
🐙 Antony
зачастую только кнопка ресет спасает :)
Меня обычно спасает хорошая ОС, у которой действительно есть вытесняющая многозадачность :)
Berkus
в msvc и gcc точно
что грохнется-то? ты про что вообще?
Anton
программа грохнется если попытаться залочить один и тот же мьютек из одного и тогоже потока дважды
Berkus
только лайвлок лучше дедлока
Constantine
чувак, ты знаешь что такое UB?
наверняка чувак проверил на MSVC и получил std::system_error
Berkus
программа грохнется если попытаться залочить один и тот же мьютек из одного и тогоже потока дважды
If lock is called by a thread that already owns the mutex, the behavior is undefined: for example, the program _may_ deadlock
Anton
я понимаю что в стандарте UB, а на рабочих системах (linux и винда) это фактически креш
Anton
в данный момент времени
Berkus
в данный момент времени
может тебе всё же лучше джаваскрипт?