2010-07-03 45 views
1

我有一個C++/Qt QThread工作線程,它將當前狀態存儲爲ENUM(例如工作,完成等值)。只有工作者線程設置ENUM。C++/Qt枚舉 - 我應該使用鎖定跨線程共享值?

我需要能夠從另一個線程(GUI線程)讀取工作線程的狀態,以顯示工作是否正在完成。

在一個線程(worker)中讀取/寫入ENUM是否安全,並在其他線程中讀取?否則,我應該在QMutex的讀/寫位置使用鎖定嗎?

+0

枚舉是不可或缺的類型,所以許多以前關於線程讀/寫的問題都適用 - 例如http://stackoverflow.com/questions/54188/are-c-reads-and-writes-of-an原子底線,你需要一個互斥或類似的。 – 2010-07-03 20:37:14

回答

1

尼爾說:是的,你需要鎖定。對於您的用例,QReadWriteLock應該比QMutex更適合。

1

一個更具體的Qt方法可以讓工作線程在狀態發生變化時發出一個狀態信號。然後,GUI將連接到信號並更新工作線程狀態所需的任何信息。如果你這樣做,並通過值傳遞狀態,你不應該需要對狀態進行任何互斥保護(因爲當你發出信號時該值被複制,該副本永遠不會改變,並且副本在UI線程中被讀取)。但是,如果您仍然需要在不同時間查詢線程的狀態,那麼您仍然需要鎖定。