Фон:
В моем приложении, написанном на С++, я создал 3 потока:
- AnalysisThread (или Продюсер): он считывает входной файл, анализирует его и генерирует шаблоны и помещает их в очередь
std::queue
1. - PatternIdRequestThread (или Потребитель): он удаляет шаблоны из очереди и отправляет их один за другим в базу данных через клиент (написанный на С++), который возвращает шаблон uid, который затем присваивается соответствующему шаблону.
- ResultPersistenceThread: он делает несколько вещей, разговаривает с базой данных, и он отлично работает, как и ожидалось, в отношении использования ЦП.
Первые два потока занимают 60-80% от использования ЦП, каждый из которых занимает в среднем 35%.
Вопрос:
Я не понимаю, почему некоторые потоки используют высокую загрузку процессора.
Я анализирую его следующим образом: если именно OS принимает решения, такие как контекстный переключатель, interrupt и scheduling в отношении того, какой поток должен получить доступ к системным ресурсам, например как процессорное время, то почему некоторые потоки в процессе используют больше процессора, чем другие? Похоже, что некоторые потоки принудительно перехватывают процессор из ОС под дулом пистолета, или у ОС есть реальное мягкое пятно для некоторых потоков, и поэтому оно смещено к ним с самого начала, предоставляя им все ресурсы, которые у него есть. Почему он не может быть беспристрастным и не дает им равных?
Я знаю, что это наивно. Но я смущаюсь больше, если я думаю по этой строке: ОС дает доступ к процессору к потоку, исходя из объема работы, которую должен выполнять поток, но как ОС вычисляет или прогнозирует объем работы до ее выполнения полностью?
Интересно, в чем причины высокой загрузки процессора? Как мы можем их идентифицировать? Можно ли их идентифицировать, просто взглянув на код? Каковы инструменты?
Я использую Visual Studio 2010.
1. Я тоже сомневаюсь в std::queue
. Я знаю, что стандартные контейнеры не являются потокобезопасными. Но если ровно один поток помещает объекты в очередь, то безопасно ли, если точно один элемент потока потока из него? Я полагаю, что это похоже на трубку, с одной стороны вы вставляете данные, с другой - удаляете данные, тогда почему это было бы небезопасно, если бы это было сделано одновременно? Но это не настоящий вопрос в этой теме, однако вы можете добавить примечание в свой ответ, обращаясь к этому.
Обновление:
После того, как я понял, что мой потребительский поток использует занятый спин, который я исправил с помощью Sleep в течение 3 секунд. Это исправление является временным, и вскоре я буду использовать Событие. Но даже с Sleep, использование ЦП снизилось до 30-40%, а иногда оно достигает 50%, что, похоже, не желательно с точки зрения удобства использования, поскольку система не отвечает на другие приложения, с которыми пользователь в настоящее время работает.
Есть ли способ улучшить производительность процессора? Как было сказано ранее, поток производителя (который в настоящее время использует большинство циклов процессора) читает файл, анализирует в нем пакеты (некоторого формата) и генерирует из них шаблоны. Если я использую сон, то использование ЦП уменьшится, но будет ли это хорошей идеей? Каковы общие способы его решения?