Сообщение Re[6]: Зацените тестовое задание от 04.10.2018 2:06
Изменено 04.10.2018 2:43 Артём
Re[6]: Зацените тестовое задание
Здравствуйте, Sharowarsheg, Вы писали:
AD>>
AD>>Тут еще сильный косяк в том, что Execute() вызывается под локом, что частично сводит на нет смысл отдельного треда. Если туда еще и цикл захреначить, то вообще все плохо станет.
S>Я бы сказал, что это менее сильный косяк. Медленно и правильно всё же лучше, чем неправильно.
Оно затупит и упадёт от нехватки памяти. Явная течь в очереди команд, неявная- может быть у вызывающего кода. Например, если вызывающий код имеет собственную очередь или вызовы идут от потоков из менеджера потоков- он можен наплодить новых worker-в.
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>>
AD>>Тут еще сильный косяк в том, что Execute() вызывается под локом, что частично сводит на нет смысл отдельного треда. Если туда еще и цикл захреначить, то вообще все плохо станет.
S>Я бы сказал, что это менее сильный косяк. Медленно и правильно всё же лучше, чем неправильно.
Оно затупит и упадёт от нехватки памяти. Явная течь в очереди команд, неявная- может быть у вызывающего кода. Например, если вызывающий код имеет собственную очередь или вызовы идут от потоков из менеджера потоков- он можен наплодить новых worker-в.
Ещё слона то не заметил. Если Execute порождает новые команды в очередь- то deadlock.
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.