Реализовать критический раздел в Qt

#multithreading #qt #qt4 #locking

#многопоточность #qt #qt4 #блокировка

Вопрос:

Мне нужно реализовать критический раздел в Qt (4.7.3, Windows XP).

Например, общедоступный слот:

void MyClass::myPublicSlot(...local params...)
{

...
block of code working with global params;
...

}

Функция void myPublicSlot запускается по таймеру.
Выполнение функции может занять много времени, иногда больше, чем тиканье таймера (или, например, нажатие кнопки).
Необходимо заблокировать block of code working with global params .
Вызов функции может быть как многопоточным, так и однопоточным.

P.S. Я пробовал использовать QMutex и QMutexLocker, но это приводит к взаимоблокировке в однопоточном случае.

Комментарии:

1. Является ли ваша функция рекурсивной? Затем вам нужно использовать рекурсивный QMutex. В противном случае вы как-то неправильно поняли семантику вашей программы.

Ответ №1:

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

Комментарии:

1. Функция не является рекурсивной. Но он содержит qApp-> processEvent(), которые позволяют запускать его больше раз.

2. Спасибо! Это работает: <код> … приватный: > изменяемый QMutex* мьютекс; … </code> <код> … //! Обработчик нажатия кнопки аннулирует MainWindow::on_pushButton_clicked() { QMutexLocker locker(мьютекс); Q_UNUSED(locker); qDebug() << «Start»; qint64 t = QDateTime::currentMSecsSinceEpoch(); // подождите 10 секунд для (int i = 0; i < 10; i) { while (QDateTime:: currentMSecsSinceEpoch() — t < (i 1)*100) qApp->processEvents(QEventLoop::AllEvents, 90); qDebug() << i; } qDebug() << «Остановить»; } … </code>