執行緒的目的是為了並行的執行**,有時執行緒需要互相等待。例如,如果兩個執行緒同時寫乙個變數,執行結果是未定義的。因此對共享資源的需要進行「同步」處理。qt提供了低階別的、高階別的機制處理執行緒同步。
上述同步類可以保證函式的執行緒安全。但是為了保證函式執行緒安全,會有效能的損耗,這也是為什麼qt部分函式不是執行緒安全的原因。
潛在風險
如果乙個執行緒對資源加鎖,但是沒有釋放鎖,這個程式就有可能被凍結(因為該資源對於其他執行緒而言就是不能處理的)。例如:在函式內部丟擲了異常並退出,但是在退出前並沒有釋放鎖。
另外的場景就是死鎖。例如:執行緒a等待執行緒b釋放資源,但是執行緒b也在等待執行緒a釋放資源,因此執行緒互相等待中(發生死鎖)。
便利類為了避免上述潛在風險第一種場景,qt提供了locker便利類:在建構函式中對資源加鎖(呼叫lock),在析構函式中對資源釋放鎖(呼叫unlock)。
不像使用低階別的執行緒同步原語,使用事件系統處理執行緒同步,不會有死鎖的風險。但是,事件系統不強制處理互斥,如果呼叫方訪問了共享資源,仍然需要使用低階別的執行緒同步原語保護共享資源。
執行緒和並行程式設計之可重入和執行緒安全(五)
檢視qt的幫助文件,經常看到函式標識 可重入 和 執行緒安全 這些說明了在多執行緒程式中是如何使用的 執行緒安全 函式可以被多個執行緒同時呼叫,甚至是呼叫方使用共享資料。因為所有對共享資料的引用是序列化的。可重入 函式可以被多個執行緒同時呼叫,但是呼叫方需要使用獨自的資料。簡述 執行緒安全的函式是可...
執行緒程式設計之同步基礎
所謂同步,即同時起步,協調一致。不同的物件,對 同步 的理解方式略有不同。如,裝置同步,是指在兩個裝置之間規定乙個共同的時間參考 資料庫同步,是指讓兩個或多個資料庫內容保持一致,或者按需要部分保持一致 檔案同步,是指讓兩個或多個資料夾裡的檔案保持一致。等等 而,程式設計中 通訊中所說的同步與生活中大...
多執行緒之執行緒同步
pulse lockobj 表示釋放當前被lock的lockobj,容許其他執行緒呼叫。相當於暫時掛起當前執行緒 wait lockobj 表示等待當前被其他執行緒占用的lockobj。下面的 將會交替執行兩個執行緒 class ticktock console.write tick monitor...