Почему пул потоков создает много уникальных потоков? - PullRequest
0 голосов
/ 31 марта 2020

COM-приложение, основанное на «свободной» модели потоков, подписывается на события, опубликованные в другом COM-приложении, для которого закончился процесс.

Приложение работает нормально. Но в некоторых случаях (или конфигурациях?) Он прожигает множество так называемых Tpp рабочих потоков.

Эти потоки, очевидно, принадлежат пулу потоков, управляемому Windows / COM. И они, по крайней мере, используются COM для доставки входящих событий в приложение.

Когда приложение получает события, это всегда происходит в контексте одного из этих рабочих потоков.

В обычном режиме В этой ситуации обновления поступают не более чем из 2 или 3 уникальных рабочих потоков.

Но в нештатной ситуации приложение видит новые уникальные идентификаторы рабочих потоков, которые появляются каждые 3-8 минут. За неделю приложение просмотрело около 1000 уникальных потоков (!).

Я очень подозреваю, что здесь что-то не так. Потому что, конечно, пулу потоков не нужно так много разных потоков, верно?

В чем может быть причина поведения пула потоков, которое я вижу. Это просто нормально, что время от времени создает разные потоки? Старые темы все еще не работают? Какое действие может вызвать это, когда приложение работает в контексте рабочего потока?

Примечания:

  • Наше приложение является клиентом OP C DA (а другое приложение - сервером Siemens OP C -DA)
  • ОС - это Windows 10
  • Я пока не знаю, завершились ли рабочие потоки или они остаются бездействующими

В качестве эксперимента я попробовал несколько неудачных / недопустимые вещи, чтобы увидеть, возможно ли для нашего приложения каким-то образом разорвать рабочий поток - что тогда объяснило бы, почему пулу потоков пришлось бы создавать новый - мы могли бы уничтожить старый. Но это выглядит сложнее, чем я ожидал:

При работе в контексте рабочего потока я пытался ...

  • сознательно зависать с while (true) {}, результат: процесс доставки событий просто останавливается, новый рабочий поток для нас не создается, хотя
  • преднамеренное необработанное исключение c ++, новый рабочий поток не создается
  • , инициирующее преднамеренное нарушение прав доступа (чтение), нет либо новый поток ...

И это заставило меня задуматься, если наше приложение не может уничтожить этот рабочий поток очевидным образом, что еще может или почему пул потоков будет вести себя так?

...