Приоритеты потоков в Qt


У каждого потока есть приоритет, указывающий процессору, как должно протекать выполнение потока по отношению к другим потокам. Приоритеты разделяются по группам:

  • в первую входят четыре наиболее часто применяемых приоритета. Их значимость распределяется по возрастанию — IdlePriority, LowestPriority, LowPriority, NormaiPriority. Они подходят для решения задач, которым процессор требуется только время от времени, например, для фоновой печати или для каких-нибудь несрочных действий;
  • во вторую группу входят два приоритета — HighPriority, HighestPriority. Пользуйтесь такими приоритетами с большой осторожностью. Обычно эти потоки большую часть времени ожидают какие-либо события;
  • в третью входят два приоритета — TimeCriticalPriority, InheritPriority. Потоки с этими приоритетами нужно создавать в случаях крайней необходимости. Эти приоритеты нужны для программ, напрямую общающихся с аппаратурой или выполняющих операции, которые ни в коем случае не должны прерваться.

Для того чтобы запустить поток с нужным приоритетом, необходимо передать одно из приведенных выше значений в метод start(). Например:


MyThread thread; 
thread.start(QThread::IdlePriority);

А для того чтобы узнать, с каким приоритетом был запущен поток, нужно вызвать метод priority(). Приоритет можно предварительно установить при помощи метода setPriority().

В Linux ядро системы запустит поток даже в том случае, если в нем уже запущены хоть 100 потоков с максимальным приоритетом. Ядро системы не потеряет работоспособность, и вы будете в состоянии запускать и другие потоки. Но в Windows все обстоит иначе, если вы запустите поток с самым высоким приоритетом, то поток с самым низким приоритетом будет просто проигнорирован и это может быть плачевно для тех, кто использует потоки с самым низким приоритетом, для проведения каких-либо вспомогательных операций, например, загрузки данных с диска.

Читать далее: Обмен сообщениями между потоками