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