Тупики, мьютексы и сигналы, слоты в Qt - PullRequest
0 голосов
/ 23 мая 2019

Я разрабатываю приложение, которое использует QSerialPort для получения данных через UART.В этом приложении я использую функцию журнала, которая пишет в файл.Перед записью в файл приложение блокирует мьютекс, а после записи в файл разблокирует мьютекс.Между блокировкой мьютекса и разблокировкой я больше не вызываю функцию журнала.

Конечно, данные, поступающие с последовательного порта, поступают асинхронно и запускают сигнал и слот, где обрабатываются данные.В этой функции, где обрабатываются данные, я снова вызываю функцию log.

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

Вопрос в том, может ли однопотоковая блокировка сама по себе, когда данные из QSerialPort поступают точно после блокировки мьютекса в функции журнала?(Это означало бы двойную блокировку одного и того же мьютекса - предположим, что мы не используем рекурсивный мьютекс)

Есть ли хороший источник знаний по такой теме?

1 Ответ

1 голос
/ 23 мая 2019

Если ваш последовательный порт получает данные точно после того, как мьютекс заблокирован, он не будет выполняться немедленно (потому что это не прерывание), но будет ожидать, когда QEventLoop выполнит приемный слот данных (в глобальном цикле обработки событий).Вы можете выполнить все события вручную с помощью qApp->processEvents(), поэтому старайтесь избегать этого внутри блока блокировки / разблокировки.

Если вы используете явный вызов функции журнала в одном потоке, у вас не будет тупика (я думаю).Но будьте осторожны с записью журнала через макрос qDebug() с переопределением qInstallMessageHandler, потому что вы можете забыть и использовать qDebug() внутри блока блокировки / разблокировки мьютекса.Тогда у вас будет тупик.

Также могут возникнуть проблемы с функциями обратного вызова внутри вашего блока блокировки / разблокировки.Так что будьте осторожны с обратными вызовами тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...