[Предыдущая: Запускаем потоки с помощью QThread] [Поддержка потоков в Qt] [Следующая: Реентерабельность и потокобезопасность]
Синхронизация потоков
Классы QMutex, QReadWriteLock, QSemaphore и QWaitCondition предоставляют средства синхронизации потоков. Хотя основная идея потоков состоит в том, чтобы сделать потоки настолько параллельными, насколько это возможно, бывают моменты, когда поток должен остановить выполнение текущих операций и подождать другие потоки. Например, если два потока одновременно пытаются получить доступ к одной глобальной переменной, то результат, обычно, не определен.
QMutex предоставляет взаимоисключающую блокировку или мьютекс. В одно и то же время не больше одного потока может блокировать мьютекс. Если поток пытается заблокировать мьютекс в то время, как он уже заблокирован, то поток переходит в режим ожидания, пока заблокировавший мьютекс поток не освободит его (мьютекс). Мьютексы часто используются для защиты доступа к разделяемым данным (т.е. данным, к которым можно обратиться из нескольких потоков одновременно). Ниже, в разделе Реентерабельность и потокобезопасность, мы используем мьютексы для создания потокобезопасного класса.
QReadWriteLock подобен QMutex за исключением того, что делает различие между доступом к данным для "чтения" и "записи" и позволяет нескольким читателям одновременно обращаться к данным. Используя, когда это возможно, QReadWriteLock вместо QMutex можно сделать многопоточную программу более согласованной.
QSemaphore - это обобщение для QMutex, которое защищает некоторое количество идентичных ресурсов. В отличие от мьютекса, защищающего лишь один ресурс. В примере "Semaphores" показано типичное использование семафоров: синхронизация доступа производителя и потребителя к кольцевому буферу.
QWaitCondition позволяет потоку пробуждать другие потоки при выполнении некоторого условия. Один или несколько потоков могут быть заблокированы в ожидании выполнения QWaitCondition, установленного в состояние wakeOne() или wakeAll(). Используйте wakeOne() для пробуждения одного случайно выбранного потока или wakeAll() для пробуждения всех. Пример "Wait Conditions" показывает, как решить проблему производитель-потребитель используя QWaitCondition вместо QSemaphore.
Обратите внимание на то, что классы синхронизации Qt зависят от использования правильно выровненных (properly aligned) указателей. Например, вы не можете использовать упакованные классы вместе с MSVC.
[Предыдущая: Запускаем потоки с помощью QThread] [Поддержка потоков в Qt] [Следующая: Реентерабельность и потокобезопасность]
Авторские права © 2010 Nokia Corporation и/или её дочерние компании |
Торговые марки |
Qt 4.6.4 |
|