執行緒建立完了之後必須要對其進行限制和控制,我們就是執行緒的監護人,不能說任由它自由,得對它進行合理約束。接下來我們講執行緒的控制部分,
1、執行緒休眠
想象一下一種情形,日常用的電腦,如果我們需要離開一段時間,那麼可能會將它暫時休眠一下,為了節約用電,也響應一下環境保護,別忘了現在都講低炭生活。那麼執行緒其實也一樣,如果乙個執行緒暫時不需要用到,我們可以先讓它睡會,其目的也是為了讓它暫時不要占用資源,主要是乙個cpu時間片的占用問題。
對於執行緒的休眠,只要簡單呼叫 qthread 的sleep ,msleep或者usleep 方法就可以了,注意這三個方法都是static protected的,這意味著你只能在繼承類裡做這個動作,它們差別僅是時間單位不同而已。
程式方面我們盡量簡單點,能看清本質就可以了,在qthread 派生類的run方法裡面用下
void cthread::run()2、執行緒喚醒}
3、執行緒關閉
如果乙個執行緒執行完了它會自己結束自己的生命。可很多情況不是這麼簡單,乙個執行緒跑到中間的時候由於某種特殊原因,就想它中止。
(1)執行緒中止方式
中止有兩種方式 強制中止和 優雅中止,這用詞可能有點不恰當,先這麼說著。在說明這兩種方式之前,有必要詳細說一下執行緒關閉的時候它到底幹了什麼。
執行緒關閉的時候,os會移除這個執行緒,這部分對我們是透明的,詳細的說明還得參閱作業系統的有關書籍,接著執行緒中分配的堆疊資訊將一併清除,但是如果是堆上分配的資訊,得由你負責自己清除,因為堆是由程序持有的,它的生命週期和執行緒沒關係。
(2)強制中止:
簡單的呼叫qthread 的方法terminate就可以進行強制中止,可這將會帶來很多災難性的後果。最為嚴重的就是乙個堆記憶體洩露的問題,執行緒強制被中止,根本沒法來得及做清理工作,即使你的執行緒 中有執行到最後清理堆記憶體,可它沒來得及執行
比如以下一段**
void cthread::run()想象一下執行緒還沒執行 到 delete c;的時候你就發出了terminate,不幸的事就發生了,由此得出結論我們應該盡最大限度避免去使用。//clean
delete c;
}
(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,...