本篇內(nèi)容介紹了“Qt如何實現(xiàn)線程同步”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
你所需要的網(wǎng)站建設(shè)服務(wù),我們均能行業(yè)靠前的水平為你提供.標準是產(chǎn)品質(zhì)量的保證,主要從事成都網(wǎng)站建設(shè)、成都做網(wǎng)站、企業(yè)網(wǎng)站建設(shè)、手機網(wǎng)站制作設(shè)計、網(wǎng)頁設(shè)計、品牌網(wǎng)站建設(shè)、網(wǎng)頁制作、做網(wǎng)站、建網(wǎng)站。創(chuàng)新互聯(lián)公司擁有實力堅強的技術(shù)研發(fā)團隊及素養(yǎng)的視覺設(shè)計專才。
問題的提出
線程安全的數(shù)據(jù)類可以提供一種便利的手段來進行線程之間的數(shù)據(jù)交換,但是這種方法并沒有協(xié)調(diào)兩個線程的動作,這一點從輸出結(jié)果也可以看出:
從輸出可以看出,數(shù)據(jù)交換要么成功,要么就根本不能進行。這就是線程間沒有同步的結(jié)果。解決這個問題就需要線程同步處理。
示例代碼
本例中定義兩個互斥量,dataReady和bufferReady。
void WriteData(int i,
QMutex& dataReady,
QMutex& bufferReady)
{
bufferReady.lock();
cout << "WT:<<<<WriteData:" <<
i << "<<<<" << endl;
int buffer[5];
for(int j = 0; j < 5; ++j)
{
buffer[j] = j;
}
data_array.setData(buffer, 5);
dataReady.unlock();
}
WriteData方法首先嘗試對bufferReady加鎖,如果數(shù)據(jù)類中沒有數(shù)據(jù)時,加鎖操作成功,接下來按照正常邏輯寫入數(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方法首先嘗試對dataReady加鎖,如果數(shù)據(jù)類中存在數(shù)據(jù)時,加鎖操作成功,接下來按照正常邏輯讀出數(shù)據(jù),最后對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)建了兩個互斥量,dataReady和bufferReady,用于讀數(shù)據(jù)操作和和寫數(shù)據(jù)操作。
由于最初沒有寫入的數(shù)據(jù),所以首先調(diào)用dataReaday.lock操作,使讀數(shù)據(jù)線程處于阻塞狀態(tài)。
CreateDataTask類沒有另外創(chuàng)建互斥量,而是使用構(gòu)造函數(shù)傳遞的兩個互斥量,然后再傳遞給WriteData函數(shù)。
執(zhí)行結(jié)果
寫數(shù)據(jù)操作,讀數(shù)據(jù)操作整齊地間隔排列,同時數(shù)據(jù)傳遞全部正確!
“Qt如何實現(xiàn)線程同步”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
分享題目:Qt如何實現(xiàn)線程同步
文章源于:http://muchs.cn/article38/jpggsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、關(guān)鍵詞優(yōu)化、云服務(wù)器、網(wǎng)站內(nèi)鏈、用戶體驗、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)