какая разница, лок-фри погроммирование не меняется уже лет 20 как :)
Как это может быть Лок фри если там лок?
там выебистой код. если я правильно понял происходящее, то чтение этого массива будет lock-free в том смысле, что ты можешь спокойно его читать даже если параллельно кто-то пытается его менять, т.к. ты эти изменения не увидишь. такие выебоны известны как "лок-фри ридинг", но я не достаточно хорошо понимаю как дотнет работает, чтобы этот код до конца понять.
называется оно rcu, но видимо чтоб не делать везде копий решили соптимизировать Add/Remove кейс без контеншна и сделать его на локе. Но я сам до конца не понимаю зачем здесь копия в локальную переменную
если они решили сделать адд / ремов на классическом локе, то код абсолютно дебильный же достаточно сделать лок(массив) и меняет его как душе угодно.
Ах, это даже не рцу, они массив реаллоцируют и ссылку меняют. А рейс происходит в момент когда два треда например делают add, оба забирают одну и ту же ссылку, первый лочит, реаллоцирует , меняет ссылку, второй проигрывает рейс. В случае если они будут лочить без копии будет другое поведение, и проверить что массив поменялся, пока ты висел в локе будет нельзя. Нужно где-то закешить старое значение
рейса там не может произойти, реаллокация под локом
Еще как происходит, потому что изменение того куда ссылается m_array не под локом
это тоже дебильный код. если ты в цикле while - классический CAS - пытаешься выиграть гонку и ты проиграл лок на текущей итерации.. НАХУЯ ЖДАТЬ ВНУТРИ ЦИЛКА?! по твоей логике там надо было пойти на след итерацию и заново перечитать ссылку
Обсуждают сегодня