Как правильно удалить объект в другом потоке
Вчера наш товарищ по команде создал код, куда он переместил 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();
}
Я недостаточно опытен в многопоточности. Может ли кто-нибудь подтвердить мои предположения?