网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

Qt如何实现线程同步

本篇内容介绍了“Qt如何实现线程同步”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

你所需要的网站建设服务,我们均能行业靠前的水平为你提供.标准是产品质量的保证,主要从事成都网站建设、成都做网站、企业网站建设、手机网站制作设计、网页设计、品牌网站建设、网页制作、做网站、建网站。创新互联公司拥有实力坚强的技术研发团队及素养的视觉设计专才。

问题的提出

线程安全的数据类可以提供一种便利的手段来进行线程之间的数据交换,但是这种方法并没有协调两个线程的动作,这一点从输出结果也可以看出:

Qt如何实现线程同步

从输出可以看出,数据交换要么成功,要么就根本不能进行。这就是线程间没有同步的结果。解决这个问题就需要线程同步处理。

示例代码

本例中定义两个互斥量,dataReady和bufferReady。

void WriteData(int i,
              QMutex& dataReady,
              QMutex& bufferReady)
{
   bufferReady.lock();
   cout << "WT:<<<           i << "<<<<" << endl;
   int buffer[5];
   for(int j = 0; j < 5; ++j)
   {
       buffer[j] = j;
   }
   data_array.setData(buffer, 5);
   dataReady.unlock();
}

WriteData方法首先尝试对bufferReady加锁,如果数据类中没有数据时,加锁操作成功,接下来按照正常逻辑写入数据,最后dataReady解锁,为ReadData创造执行条件。

void ReadData(int i,  
            QMutex& dataReady,
            QMutex& bufferReady)
{
   dataReady.lock();
   cout << "RT:>>>>ReadData:" <<
           i << ">>>>" << endl;
   int buffer[5];
   int data_size =
       data_array.removeData(buffer, 5);
   cout << "RT::----data_size=" <<
           data_size << endl;
   int total = 0;
   for(int k = 0; k < data_size; ++k)
   {
       total += buffer[k];
   }
   cout << "RT:----total="  <<
                    total << endl;
   bufferReady.unlock();
}

ReadData方法首先尝试对dataReady加锁,如果数据类中存在数据时,加锁操作成功,接下来按照正常逻辑读出数据,最后对bufferReady解锁,为WriteData创造执行条件。

int main(int /*argc*/, char*[] /*argv*/)
{
   //define CreateDataTask class.
   class CreateDataTask : public QThread
   {
       QMutex& m_data;
       QMutex& m_buffer;
   public:
       CreateDataTask(QMutex& dataReady,
                      QMutex& bufferReady)
           :m_data(dataReady)
           ,m_buffer(bufferReady)
       {
       }
   private:
       void run()
       {
           for(int i = 0; i < 10; ++i)
           {
               WriteData(i, m_data, m_buffer);
           }
       }
   };
    QMutex dataReady;
   QMutex bufferReady;
    ::timeBeginPeriod(1);
   dataReady.lock();
   //Create thread object of CreateDataTask.
   CreateDataTask *writer =
      new CreateDataTask(dataReady,  
                         bufferReady);
   //Start Thread.
   writer->start(QThread::NormalPriority);
   for(int i = 0; i < 10; ++i)
   {
       ReadData(i, dataReady, bufferReady);
   }
   timeEndPeriod(1);
   getch();    
   return 0;
}

Main函数中创建了两个互斥量,dataReady和bufferReady,用于读数据操作和和写数据操作。

由于最初没有写入的数据,所以首先调用dataReaday.lock操作,使读数据线程处于阻塞状态。

CreateDataTask类没有另外创建互斥量,而是使用构造函数传递的两个互斥量,然后再传递给WriteData函数。

执行结果

Qt如何实现线程同步

写数据操作,读数据操作整齐地间隔排列,同时数据传递全部正确!

“Qt如何实现线程同步”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


本文题目:Qt如何实现线程同步
文章URL:http://bjjierui.cn/article/jpggsp.html

其他资讯