真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Qt如何實(shí)現(xiàn)線程同步

本篇內(nèi)容介紹了“Qt如何實(shí)現(xiàn)線程同步”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

你所需要的網(wǎng)站建設(shè)服務(wù),我們均能行業(yè)靠前的水平為你提供.標(biāo)準(zhǔn)是產(chǎn)品質(zhì)量的保證,主要從事成都網(wǎng)站建設(shè)、成都做網(wǎng)站、企業(yè)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站制作設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、品牌網(wǎng)站建設(shè)、網(wǎng)頁(yè)制作、做網(wǎng)站、建網(wǎng)站。創(chuàng)新互聯(lián)公司擁有實(shí)力堅(jiān)強(qiáng)的技術(shù)研發(fā)團(tuán)隊(duì)及素養(yǎng)的視覺(jué)設(shè)計(jì)專(zhuān)才。

問(wèn)題的提出

線程安全的數(shù)據(jù)類(lèi)可以提供一種便利的手段來(lái)進(jìn)行線程之間的數(shù)據(jù)交換,但是這種方法并沒(méi)有協(xié)調(diào)兩個(gè)線程的動(dòng)作,這一點(diǎn)從輸出結(jié)果也可以看出:

Qt如何實(shí)現(xiàn)線程同步

從輸出可以看出,數(shù)據(jù)交換要么成功,要么就根本不能進(jìn)行。這就是線程間沒(méi)有同步的結(jié)果。解決這個(gè)問(wèn)題就需要線程同步處理。

示例代碼

本例中定義兩個(gè)互斥量,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方法首先嘗試對(duì)bufferReady加鎖,如果數(shù)據(jù)類(lèi)中沒(méi)有數(shù)據(jù)時(shí),加鎖操作成功,接下來(lái)按照正常邏輯寫(xiě)入數(shù)據(jù),最后dataReady解鎖,為ReadData創(chuàng)造執(zhí)行條件。

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方法首先嘗試對(duì)dataReady加鎖,如果數(shù)據(jù)類(lèi)中存在數(shù)據(jù)時(shí),加鎖操作成功,接下來(lái)按照正常邏輯讀出數(shù)據(jù),最后對(duì)bufferReady解鎖,為WriteData創(chuàng)造執(zhí)行條件。

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函數(shù)中創(chuàng)建了兩個(gè)互斥量,dataReady和bufferReady,用于讀數(shù)據(jù)操作和和寫(xiě)數(shù)據(jù)操作。

由于最初沒(méi)有寫(xiě)入的數(shù)據(jù),所以首先調(diào)用dataReaday.lock操作,使讀數(shù)據(jù)線程處于阻塞狀態(tài)。

CreateDataTask類(lèi)沒(méi)有另外創(chuàng)建互斥量,而是使用構(gòu)造函數(shù)傳遞的兩個(gè)互斥量,然后再傳遞給WriteData函數(shù)。

執(zhí)行結(jié)果

Qt如何實(shí)現(xiàn)線程同步

寫(xiě)數(shù)據(jù)操作,讀數(shù)據(jù)操作整齊地間隔排列,同時(shí)數(shù)據(jù)傳遞全部正確!

“Qt如何實(shí)現(xiàn)線程同步”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


當(dāng)前文章:Qt如何實(shí)現(xiàn)線程同步
網(wǎng)頁(yè)鏈接:http://weahome.cn/article/jpggsp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部