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

Вопрос в том, зачем этот код вообще нужен? От чего

конкретно он защищает ?

13 ответов

26 просмотров

выше пояснили. а защита не может быть лишней, мало ли сто кому в голову взбредёт

От второго потока, который может вклиниться на if

Rudeus
От второго потока, который может вклиниться на if

на самом деле многопочные защиты, в идеале, реализуются блокировками, а не такими условиями

Jack128- Автор вопроса
Rudeus
От второго потока, который может вклиниться на if

каким образом?? Если frefcount = 0, то не у кого нету ссылок на интерфейс. И никто не может никуда вклинится. В этом и смысл использования interlockeddecrement/interlockedincrement

Jack128
каким образом?? Если frefcount = 0, то не у кого...

Хитрость программистов никто не отменял, как и приведение типа. Переключение потока разное везде, там между декрементом и дестроем много чего пролетит

Jack128- Автор вопроса
Iluha Companets
на самом деле многопочные защиты, в идеале, реализ...

Открой для себя чудесный мир lockfree алгоритмов https://en.wikipedia.org/wiki/Non-blocking_algorithm

Jack128- Автор вопроса
Rudeus
Хитрость программистов никто не отменял, как и при...

ну дык от какой конкретно хитрости то эта фигня спасет ??

Jack128
ну дык от какой конкретно хитрости то эта фигня сп...

Преобразуй интерфейс к указателю, потом обратно

Jack128- Автор вопроса
Rudeus
Преобразуй интерфейс к указателю, потом обратно

И ?? А как эта проверка с fdestroycount поможет ?? Она только побьет чужую память

Jack128
И ?? А как эта проверка с fdestroycount поможет ??...

Или даже проще, просто лишний раз ручками вызвать release а fdestroycount сторожит от вызова destroy второй раз

Jack128- Автор вопроса
Rudeus
Или даже проще, просто лишний раз ручками вызвать ...

Повторюсь, ну да, вызвал я ручками _Release , а чем fdestroycount то поможет ?? После первого _Release frefcount стала 0, память из подобъекта освободилась. Возможно ушла к кому нить другому на другие нужды. при втором (лишнем) _Release - во первых InterlockedDecriment вернет -1 (если больше никто не трогал память) и мы вообще в ветку с проверкой fdestroycount не войдем. Но это уже некоректное поведение, потому что мы переписали чужую память. но даже если память ушла к другому объекту и он выставил в frefcount = 1 , то мы ему обнулили это frefcount (то есть побили тому объекту данные) , потом заинкрементили fdestroycount (еще раз побили чужие данные) ну и не вызвали destroy. Где тут защита ?

Jack128
И ?? А как эта проверка с fdestroycount поможет ??...

В общем, предположим есть функция, которая создает объект, берет интерфейс, преобразует к pointer и отдает в другой поток. На окончании падает в release, там 0 и управление передается во второй поток, который разыменовывает указатель, делает addref и release, чей вызов тоже дает 0, далее fdestroycount = 1 и идет дестрой. и тут просыпается первый поток, вызывает инкремент fdestroycountи получает 2

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта