我有一個單一類實現使用Q_GLOBAL_STATIC
包含一個數據結構,必須從多個線程訪問,我在類中實現訪問器函數,這將訪問數據,以便所有對共享數據的訪問都被序列化。使用QAbstractTableModel中的多個線程之間共享的數據
的問題是,我想在一個QAbstractTableModel
使用這些數據,我可以簡單地從我重寫data()
,columnCount()
和rowCount()
使用存取功能,我實現並獲得一個項目在一個時間。但我認爲這是不夠的,因爲在後續的兩個調用data()
之間,另一個線程可能會跳入並更改項目數(例如rowCount()
),並且模型的線程可能最終訪問超出界限的數據。
我想我需要的columnCount()
和模型復位rowCount()
最先調用之前鎖定的互斥體,和解鎖,只有當所有的數據讀入模型(以data()
最後一次通話後),有沒有這樣做的方式?還是我在想錯誤的方式?
我想拷貝共享數據結構到模型重置的本地一個(並且只有在複製操作時才鎖定互斥鎖),並且在那之後安全地訪問複製的數據,但這不是過度殺傷?沒有更有效的解決方案嗎?
PS:您仍然可以在幾個模型實例之間共享數據,因爲所有視圖都由主(GUI)線程執行,並且不會同時調用兩個模型。 – Jim
感謝您的回答,我想我將不得不切換到單線程設計,以避免這樣的問題 – Mike