конкретно он защищает ?
выше пояснили. а защита не может быть лишней, мало ли сто кому в голову взбредёт
От второго потока, который может вклиниться на if
на самом деле многопочные защиты, в идеале, реализуются блокировками, а не такими условиями
каким образом?? Если frefcount = 0, то не у кого нету ссылок на интерфейс. И никто не может никуда вклинится. В этом и смысл использования interlockeddecrement/interlockedincrement
Хитрость программистов никто не отменял, как и приведение типа. Переключение потока разное везде, там между декрементом и дестроем много чего пролетит
Открой для себя чудесный мир lockfree алгоритмов https://en.wikipedia.org/wiki/Non-blocking_algorithm
ну дык от какой конкретно хитрости то эта фигня спасет ??
Преобразуй интерфейс к указателю, потом обратно
И ?? А как эта проверка с fdestroycount поможет ?? Она только побьет чужую память
Или даже проще, просто лишний раз ручками вызвать release а fdestroycount сторожит от вызова destroy второй раз
Повторюсь, ну да, вызвал я ручками _Release , а чем fdestroycount то поможет ?? После первого _Release frefcount стала 0, память из подобъекта освободилась. Возможно ушла к кому нить другому на другие нужды. при втором (лишнем) _Release - во первых InterlockedDecriment вернет -1 (если больше никто не трогал память) и мы вообще в ветку с проверкой fdestroycount не войдем. Но это уже некоректное поведение, потому что мы переписали чужую память. но даже если память ушла к другому объекту и он выставил в frefcount = 1 , то мы ему обнулили это frefcount (то есть побили тому объекту данные) , потом заинкрементили fdestroycount (еще раз побили чужие данные) ну и не вызвали destroy. Где тут защита ?
В общем, предположим есть функция, которая создает объект, берет интерфейс, преобразует к pointer и отдает в другой поток. На окончании падает в release, там 0 и управление передается во второй поток, который разыменовывает указатель, делает addref и release, чей вызов тоже дает 0, далее fdestroycount = 1 и идет дестрой. и тут просыпается первый поток, вызывает инкремент fdestroycountи получает 2
Делали как могли😊
Обсуждают сегодня