Qt中多執行緒系列之執行緒控制

2021-05-27 02:42:09 字數 2023 閱讀 5636

執行緒建立完了之後必須要對其進行限制和控制,我們就是執行緒的監護人,不能說任由它自由,得對它進行合理約束。接下來我們講執行緒的控制部分,

1、執行緒休眠

想象一下一種情形,日常用的電腦,如果我們需要離開一段時間,那麼可能會將它暫時休眠一下,為了節約用電,也響應一下環境保護,別忘了現在都講低炭生活。那麼執行緒其實也一樣,如果乙個執行緒暫時不需要用到,我們可以先讓它睡會,其目的也是為了讓它暫時不要占用資源,主要是乙個cpu時間片的占用問題。

對於執行緒的休眠,只要簡單呼叫 qthread 的sleep ,msleep或者usleep 方法就可以了,注意這三個方法都是static protected的,這意味著你只能在繼承類裡做這個動作,它們差別僅是時間單位不同而已。

程式方面我們盡量簡單點,能看清本質就可以了,在qthread 派生類的run方法裡面用下

void cthread::run()    

}

2、執行緒喚醒

3、執行緒關閉

如果乙個執行緒執行完了它會自己結束自己的生命。可很多情況不是這麼簡單,乙個執行緒跑到中間的時候由於某種特殊原因,就想它中止。

(1)執行緒中止方式

中止有兩種方式 強制中止和  優雅中止,這用詞可能有點不恰當,先這麼說著。在說明這兩種方式之前,有必要詳細說一下執行緒關閉的時候它到底幹了什麼。

執行緒關閉的時候,os會移除這個執行緒,這部分對我們是透明的,詳細的說明還得參閱作業系統的有關書籍,接著執行緒中分配的堆疊資訊將一併清除,但是如果是堆上分配的資訊,得由你負責自己清除,因為堆是由程序持有的,它的生命週期和執行緒沒關係。

(2)強制中止:

簡單的呼叫qthread 的方法terminate就可以進行強制中止,可這將會帶來很多災難性的後果。最為嚴重的就是乙個堆記憶體洩露的問題,執行緒強制被中止,根本沒法來得及做清理工作,即使你的執行緒 中有執行到最後清理堆記憶體,可它沒來得及執行

比如以下一段**

void cthread::run()    

//clean    

delete c;    

}

想象一下執行緒還沒執行 到 delete c;的時候你就發出了terminate,不幸的事就發生了,由此得出結論我們應該盡最大限度避免去使用。

(3)優雅的中止:

那麼怎麼優雅的關閉執行緒呢?我們應該通知執行緒,讓執行緒自己去接手關閉,各自關注自己所需的事,就都能做得更好,一手抓就會帶來很多問題

那麼怎麼通知執行緒呢? 一般會採用以下的步驟

1.在qthread中派生類 定義乙個公用方法出來 供中止時呼叫,比如stop()

2.呼叫者 直接 呼叫stop方法

3.派生類stop方法 ,設定 中止標誌,一般就是bool成員

4.run方法 執行的時候,檢查bool成員,判斷是否需要退出程序,最後做清理工作

#ifndef cthread_h    

#define cthread_h    

#include<

qthread

>

class cthread : public qthread    

;    

#endif // cthread_h  

#include<

qdebug

>

#include "cthread.h"    

cthread::cthread():qthread(),mstop(false)    

cthread::~cthread()    

void cthread::run()    

qdebug()<

<

i;    

sleep(1);    

}    

//clean up    

delete c;    

}    

void cthread::stop()    

Qt學習(二) 多執行緒控制

執行緒之間存在著相互制約的關係,具體可分為互斥和同步這兩種關係。在程式中,通常都會用到叫做 臨界資源 的東西,可能是一塊記憶體,乙個資料結構,乙個檔案等具有排他性使用的東西。這些東西,在多執行緒環境下,必須進行互斥處理,才能安全地使用臨界資源。所以,對臨界資源執行互斥操作的 片段,叫做臨界區。互斥量...

linux多執行緒控制

include include include include include define size 1024 函式作用 使用訊號量控制,讀取輸入,獲得長度 void thread function void argv char buf size sem t sem int main res pt...

python多執行緒控制

利用wait的阻塞機制,就能夠實現暫停和恢復了,再配合迴圈判斷標識位,就能實現退出了 usr bin env python coding utf 8 import threading import time class job threading.thread def init self,args,...