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

????????????????????????????????????????????????

?????????

 

???????????????????????