Информация об изменениях

Сообщение Re[6]: Зацените тестовое задание от 04.10.2018 2:06

Изменено 04.10.2018 2:43 Артём

Re[6]: Зацените тестовое задание
Здравствуйте, Sharowarsheg, Вы писали:

AD>>
S>>>ВОТ ЗДЕСЬ
S>>>если в этот момент успеть вызвать ещё одно Enqueue, то в очереди будет два запроса, а считается только один

S>>>            lock (_commandQueue)
S>>>            {

S>>>чтобы исправить, надо делать тут цикл и читать все запросы, пока очередь не кончится

S>>>                Command command = _commandQueue.Dequeue();
S>>>                command.Execute();
S>>>            }
S>>>        }
S>>>    }
S>>>


AD>>Тут еще сильный косяк в том, что Execute() вызывается под локом, что частично сводит на нет смысл отдельного треда. Если туда еще и цикл захреначить, то вообще все плохо станет.


S>Я бы сказал, что это менее сильный косяк. Медленно и правильно всё же лучше, чем неправильно.


Оно затупит и упадёт от нехватки памяти. Явная течь в очереди команд, неявная- может быть у вызывающего кода. Например, если вызывающий код имеет собственную очередь или вызовы идут от потоков из менеджера потоков- он можен наплодить новых worker-в.
Re[6]: Зацените тестовое задание
Здравствуйте, Sharowarsheg, Вы писали:

AD>>
S>>>ВОТ ЗДЕСЬ
S>>>если в этот момент успеть вызвать ещё одно Enqueue, то в очереди будет два запроса, а считается только один

S>>>            lock (_commandQueue)
S>>>            {

S>>>чтобы исправить, надо делать тут цикл и читать все запросы, пока очередь не кончится

S>>>                Command command = _commandQueue.Dequeue();
S>>>                command.Execute();
S>>>            }
S>>>        }
S>>>    }
S>>>


AD>>Тут еще сильный косяк в том, что Execute() вызывается под локом, что частично сводит на нет смысл отдельного треда. Если туда еще и цикл захреначить, то вообще все плохо станет.


S>Я бы сказал, что это менее сильный косяк. Медленно и правильно всё же лучше, чем неправильно.


Оно затупит и упадёт от нехватки памяти. Явная течь в очереди команд, неявная- может быть у вызывающего кода. Например, если вызывающий код имеет собственную очередь или вызовы идут от потоков из менеджера потоков- он можен наплодить новых worker-в.
Ещё слона то не заметил. Если Execute порождает новые команды в очередь- то deadlock.