169 похожих чатов

Можно ли использовать вместо TCriticalSection.TryEnter TInterlocked.CompareExchange? В том числе под Linux. Нет ли

глюков?

35 ответов

9 просмотров

Стикер

Нет нельзя - они отвечают за разные вещи

В моих экспериментах CriticalSection работала лучше и быстрее спинлоков на атомарных счетчиках. Но в то же время CriticalSection может сделать больно в DLL (нельзя использовать в инициализации) и не везде доступно TryEnter

Роман-Лях (rgreat) Автор вопроса
Sergey Bodrov
В моих экспериментах CriticalSection работала лучш...

Проблема в том что CriticalSection под линуксом реализована через TMonitor. А к нему мало доверия.

Sergey Bodrov
В моих экспериментах CriticalSection работала лучш...

CS внутри на Винде - это комбинация спинлока в третьем кольце с заданным (можно изменить при создании) количеством итераций и ядерного Wait'а, если на уровне пользователя не получилось. И хороший результат виндового CS - в этой комбинации.

Роман Лях (rgreat)
Проблема в том что CriticalSection под линуксом ре...

У кого реализована? через pthread_mutex реализована так-то

Роман Лях (rgreat)
в Delphi

А, ну может быть, там не смотрел

Александр (Rouse_) Багель
Сорцы винды читал? :)

Читал. Но это описано в Internals.

Sergey Bodrov
В моих экспериментах CriticalSection работала лучш...

Рихтер писал что атомарные ф-ии чувствительны к выравниванию данных по кэш линиям

Александр (Rouse_) Багель
Сорцы винды читал? :)

Далеко не ты один их почитываешь))

Александр Смоляков
Рихтер писал что атомарные ф-ии чувствительны к вы...

Атомик не должен пересекать границу cache line. Ибо лочится все по ним

Konstantin
Далеко не ты один их почитываешь))

Да я ж не против, наоборот, парень очень крепко отвечает (и не первый раз), я себе даже пометочку сделал :)

Роман-Лях (rgreat) Автор вопроса
Boris Usievich
Атомик не должен пересекать границу cache line. Иб...

В чем это выражается на практике? Есть какой-то шанс работать не с кэшем?

Роман Лях (rgreat)
В чем это выражается на практике? Есть какой-то ш...

Ну тут же все написано https://learn.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-interlockedcompareexchange

Роман-Лях (rgreat) Автор вопроса
Роман-Лях (rgreat) Автор вопроса
Александр (Rouse_) Багель
screenshot Между строк

Типа не надо использовать кривой и нестандартный мэнеджер памяти? Ну ок.

Роман Лях (rgreat)
Типа не надо использовать кривой и нестандартный м...

Там на самом деле очень интересные моменты, если есть возможность изучи исходники винды - там в некоторых местах ТААААК КРАСИВО сделано, причем сам алго рассчитан именно на выравнивание

Роман-Лях (rgreat) Автор вопроса
Роман Лях (rgreat)
Да меня больше работа в линукс интересует.

А, ну там не сильно в этом плане отличается, блокировка всеравно через LOCK делается :)

Роман Лях (rgreat)
В чем это выражается на практике? Есть какой-то ш...

на x86 может дополнительно тормозить (хотя вроде должно работать). на других архитектурах может и поломаться

Роман Лях (rgreat)
Да меня больше работа в линукс интересует.

дело не в винде или линуксе, дело в том, как устроено железо

Роман-Лях (rgreat) Автор вопроса
Boris Usievich
дело не в винде или линуксе, дело в том, как устро...

Это все интересно и загадочно, но как бы поближе к конкретике? :)

Роман-Лях (rgreat) Автор вопроса

Да я спокоен. Нет проблем. :) ^ вот, собственно первый пост по теме.

Роман Лях (rgreat)
Это все интересно и загадочно, но как бы поближе к...

Тогда - если смотреть на проблему из аппаратной области, проблемы в случае использования RTL обертки должны отсутствовать ибо она сделана с учетом всех нюансов

Роман Лях (rgreat)
Да я спокоен. Нет проблем. :) ^ вот, собственно ...

НО - отвечая на твой вопрос (причем во второй раз) так делать нельзя ибо перечисленное тобой применяется в двух разных сидуациях. Критсекция - это прямо вот когда кусок кода на исполнение залочить надо, а эксченж - это обычный безопасный трансфер массива данных под блокировкой. Они не взаимозаменяемы

Роман Лях (rgreat)
Типа не надо использовать кривой и нестандартный м...

Нет, это значит, что выровненные на адрес значения под х86 меняются атомарно.

Роман-Лях (rgreat) Автор вопроса
Роман Лях (rgreat)
Так то одно есть прямое следствие другого.

Можно иметь сколь угодно прямой МП второго уровня и работать с полем внутри упакованной записи и т.п. А насчёт кривости МП - например, библиотека OTL прямо проверяет, как МП выравнивает блоки и крашится, если что-то не так, т.к. завязана на выравнивание в некоторых местах.

Роман Лях (rgreat)
Так то одно есть прямое следствие другого.

Ну я ж сказал cmpxcg требует в противном случае будет непонятное поведение

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта