執行緒和事件迴圈

2021-07-26 18:54:01 字數 1203 閱讀 8667

1.執行緒

可重入的(reentrant):如果多個執行緒可以在同一時刻呼叫乙個類的所有函式,並且保證每一次函式呼叫都引用乙個唯一的資料,就稱這個類是可重入的。如果該函式允許多個執行緒在同一時刻呼叫,而每一次的呼叫都只能使用其獨有的資料。全域性變數就不是函式獨有的資料,而是共享的。換句話說,這意味著類或者函式的使用者必須使用某種額外的機制(比如鎖)來控制對物件的例項或共享資料的序列化訪問。

執行緒安全(thread-safe):如果多個執行緒可以在同一時刻呼叫乙個類的所有函式,即使每一次函式呼叫都引用乙個共享的資料,就說這個類是執行緒安全的。如果多個執行緒可以在同一時刻訪問函式的共享資料,就稱這個函式是執行緒安全的。

進一步說,對於乙個類,如果不同的例項可以被不同執行緒同時使用而不受影響,就說這個類是可重入的;如果這個類的所有成員函式都可以被不同執行緒同時呼叫而不受影響,即使這些呼叫針對同乙個物件,那麼我們就說這個類是執行緒安全的。

2.事件迴圈

事件並不是一產生就被分發。事件產生之後被加入到乙個佇列中,該佇列即被稱為事件佇列。事件分發器遍歷事件佇列,如果發現事件佇列中有事件,那麼就把這個事件傳送給它的目標物件。這個迴圈被稱作事件迴圈。

事件可以由程式生成,也可以在程式外部生成。例如:

1.qkeyevent和qmouseevent物件表示鍵盤或滑鼠的互動,通常由系統的視窗管理器產生;

2.qtimerevent事件在定時器超時時傳送給乙個qobject,定時器事件通常由作業系統發出;

3.qchildevent在增加或刪除子物件時傳送給乙個qobject,這是由 qt 應用程式自己發出的。

事件迴圈的偽**描述大致如下所示:

while (is_active)

wait_for_more_events();

}

while會遍歷整個事件佇列,傳送從佇列中找到的事件;

wait_for_more_events();阻塞事件迴圈,直到又有新的事件產生。可以被以下幾種情況喚醒。

1.視窗管理器的動作(鍵盤、滑鼠按鍵按下、與窗**互等);

2.套接字動作(網路傳來可讀的資料,或者是套接字非阻塞寫等);

3.定時器;

4.由其它執行緒發出的事件。

Qt 多執行緒之逐執行緒事件迴圈

從別的執行緒中訪問qobject子類 qobject和所有它的子類是非執行緒安全的。這包括整個的事件投遞系統。需要牢記的是,當你正從別的執行緒中訪問物件時,事件迴圈可以向你的qobject子類投遞事件。假如你呼叫乙個不生存在當前執行緒中的qobject子類的函式時,你必須用mutex來保護qobje...

Node 事件迴圈和非同步IO 程序和執行緒的關係

會有乙個呼叫執行棧,只要棧為空的時候才會執行巨集任務微任務。並且執行任何乙個巨集任務之前,會檢視微任務佇列是否有任務需要執行,也就是說巨集任務的函式裡如果有微任務的入列,執行下乙個巨集任務之前會除了執行完當前巨集任務的主線程 後再執行優先把剛剛加入微任務佇列的微任務 常見的巨集任務 ajax,dom...

QT核心 生存執行緒及事件迴圈

qt最核心的兩個東西莫過於元物件和事件迴圈了,這兩個特性是日常程式設計中的兩大利器,理解和使用好這兩個特性對寫qt程式有非常大的幫助,就比如qt乙個創新功能點訊號槽就是利用這兩個特性實現 後面可能會單獨講解 我們這裡率先理解一下事件迴圈,畢竟元物件裡面有個東西也是利用事件迴圈來實現的 後面會說 生存...