Как правильно удалить объект в другом потоке

Вчера наш товарищ по команде создал код, куда он переместил query.destroy() в отдельный поток. Он сделал это для того, чтобы сделать код быстрее.

    private queryBag : IQueryBag
    ... ... ...
    private function destroyQueryBag() : Void
    {
        CoreThread.transferToCoreThread(function()
        {
            if (queryBag != null)
            {
                queryBag.destroy();
                queryBag = null;
            }
        });
    }

    private function resetRequestsAndResponses() : Void
    {
        destroyQueryBag();
        queryBag = null;
        queryBag = createNewQueryBag();
    }

Но я нашел этот код для Рики. Что если новый поток вызовет свой код слишком поздно после создания NewQueryBag? В этом случае queryBag будет по-прежнему нулевым. Я думаю, что новый поток должен использовать другую ссылку, и правильный код должен быть похож на следующий:

    private var queryBag : IQueryBag
    ... ... ...
    private function destroyQueryBag() : Void
    {
        private var tempQueryBag = queryBag; // another reference !!!
        queryBag = null;
        CoreThread.transferToCoreThread(function()
        {
            if (tempQueryBag != null)
            {
                tempQueryBag.destroy();
                tempQueryBag = null;
            }
        });
    }

    private function resetRequestsAndResponses() : Void
    {
        destroyQueryBag();
        queryBag = createNewQueryBag();
    }

Я недостаточно опытен в многопоточности. Может ли кто-нибудь подтвердить мои предположения?

0 ответов

Другие вопросы по тегам