Linux Qt使用POSIX多线程条件变量、互斥锁(量)
- 2019 年 10 月 3 日
- 筆記
??????????????????????????????????????
??????POSIX?????????????????????????Qt???????????????????????????????????
????????UI???????????????????Qt????????????????????????????????????QApplication::processEvents()?????UI??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Linux POSIX?????????
?????ubuntu 14.04? Qt 5.5.1? Posix???(C???)
???????????Linux C???????Qt?????????????????????????????????????????????????????????????????????????????????
??????????????UI??????????????????????push?????????????????while?pop??????????????????????
??????????(??????)???????????????????????????
1. UI????push??(??????)
??????????lineEdit???????????????????????? ????????????????????????????????????????????????????????????????????????????
void Widget::on_le_writeNum_returnPressed() { int status; status = pthread_mutex_lock (&mp_processThread->m_structCondition.mutex); if (status != 0) err_abort (status, "Lock mutex"); QString num = ui->le_writeNum->text(); mp_processThread->queuePushData(num.toInt()); status = pthread_cond_signal (&mp_processThread->m_structCondition.cond); // status = pthread_cond_broadcast( &mp_processThread->m_structCondition.cond); if (status != 0) err_abort (status, "Signal condition"); status = pthread_mutex_unlock (&mp_processThread->m_structCondition.mutex); if (status != 0) err_abort (status, "Unlock mutex"); }
??
2. ?????pop??
???????Qt?moveToThread?????????????????????????????????????????(start())????????while???????????????????????????????????????????pthread_cond_wait()?????????????????????????????????????????????????????????????????????????????????????????????????????????????????
void ProcessThread::slot_processData() { int status; while(!mb_stopThread) { status = pthread_mutex_lock (&m_structCondition.mutex); if (status != 0) err_abort (status, "Lock mutex"); while(m_queue.empty()) //if queue is empty, wait contion { //???????? status = pthread_cond_wait(&m_structCondition.cond, &m_structCondition.mutex); // qDebug() << "pthread_cond_wait is block func!"; if (status != 0) { err_abort (status, "Wait on cond faild"); } } while(!m_queue.empty()) { qDebug() << "queue mem is" << m_queue.back(); m_queue.pop(); } status = pthread_mutex_unlock (&m_structCondition.mutex); if (status != 0) err_abort (status, "Unlock mutex"); } }
??
3. ?????????
??????????
????????????????????????????????? while(1)??????????CPU?????ubuntu????htop????? ???
??status = pthread_cond_wait(&m_structCondition.cond,
&m_structCondition.mutex);
???????CPU???????????????????????????
??????????
??????CPU??????????????????????????????????????????????CPU???????? ????????????????????????????????????????????????????????????????5ms??????5ms????????????????????????????
????????UI?????????????
QThread: Destroyed while thread is still running
????????????????????????????????????????????????
?????????
???????????????????????