我有兩個C++類,objecManip
和updater
。 updater
類有一個計時器來檢查我的應用程序的機器人手臂的狀態。使用C++實時編程
如果然後移動從做動作隊列什麼,否則getNextAction()。
動作隊列由類objectManip
填充。我有一個全局變量:我需要objectManip
的機器人手臂的current_status
。
問題是,當填寫行動隊列current_status
是不斷動態的。
我有兩個C++類,objecManip
和updater
。 updater
類有一個計時器來檢查我的應用程序的機器人手臂的狀態。使用C++實時編程
如果然後移動從做動作隊列什麼,否則getNextAction()。
動作隊列由類objectManip
填充。我有一個全局變量:我需要objectManip
的機器人手臂的current_status
。
問題是,當填寫行動隊列current_status
是不斷動態的。
問題很不清楚,所以這真的是在黑暗中刺,但你需要使用原子數據類型。隨着C++ 11,你有std::atomic
(見here或here。對於一個早期版本的C++,我認爲你需要使用一些庫或編譯器特定的數據類型,它提供原子數據類型。
如果你做一些假設你的CPU和操作系統的多線程是如何工作的,你可以使用或,只是聲明共享變量volatile
,當你使用它的時候讀取值到temp變量。volatile
確實用於讀取硬件映射值的情況,每次都必須從內存中讀取,所以很多優化是不可能的,它不能保證本身的原子更新,因爲修改值的線程可能在更新過程中被中斷,然後ano其閱讀可能會讀取無效的,部分更新的值。對於布爾值來說,這應該是相當安全的。對於不跨越存儲器字邊界且字大小或更小的整數,這對許多CPU可能是安全的,在寫入單個存儲器字時不會中斷線程。否則,數據損壞正在等待發生。一些(今天不常見的)CPU也不會同步多個CPU內核之間的高速緩存,在這種情況下,volatile
將無濟於事,不同的線程可能會看到不同的高速緩存值。所以得出結論:使用volatile
作爲最後的手段破解!
我正在與單核,我可能會嘗試你的解決方案,thx – 2013-03-10 07:57:15
爲什麼發佈代碼看起來不是個好主意? – Shoe 2013-03-10 07:46:05
你的問題是什麼? – 2013-03-10 07:48:29
當填充動作隊列時,current_status值被當作它的內容,我需要它動態的,以便它在更新器中調用動作時取得新值。 – 2013-03-10 07:53:41