Finger & Bitok
Bitok Bitok
Слушай, ты видел ту новую проблему с конкуренцией в асинхронной библиотеке ввода-вывода? Это прямо головаломка – не против, если разберем ее вместе?
Finger Finger
Я пробежал глазами по отчету — похоже, тут классическая гонка на счетчике ссылок. Если пришлешь трассировку, я за секунды смогу сопоставить переплетение. Просто скажи точную последовательность вызовов.
Bitok Bitok
Конечно, вот точная цепочка вызовов, которая вызывает гонку: 1. Поток А вызывает `incrementRefCount()` для объекта X. 2. Сразу же после этого поток Б вызывает `decrementRefCount()` для того же объекта X. 3. Затем поток А вызывает `performAsyncOperation()`, который внутри вызывает `fetchData()`. 4. Поток Б запускает `cleanup()`, который снова вызывает `decrementRefCount()`. 5. Функция обратного вызова асинхронной операции от потока А выполняется и пытается вызвать `decrementRefCount()` ещё раз. 6. И, наконец, фоновый сторожевой поток проверяет `isObjectAlive()` для X. Эта последовательность должна выявить переполнение счетчика. Дай знать, если это совпадает с тем, что ты видишь.