我想驗證我的理解是正確的。這種事情很棘手,所以我幾乎肯定我錯過了一些東西。我有一個由實時線程和非實時線程組成的程序。我希望非RT線程能夠將指針交換到由RT線程使用的內存。原子交換在GNU C++
從文檔,我的理解是,這可以在g++
與實現:
// global
Data *rt_data;
Data *swap_data(Data *new_data)
{
#ifdef __GNUC__
// Atomic pointer swap.
Data *old_d = __sync_lock_test_and_set(&rt_data, new_data);
#else
// Non-atomic, cross your fingers.
Data *old_d = rt_data;
rt_data = new_data;
#endif
return old_d;
}
這在rt_data
修改程序(比初始設置等)的唯一地方。當在實時上下文中使用rt_data
時,它被複制到本地指針。對於old_d
,稍後確定不使用舊內存時,它將在非RT線程中釋放。它是否正確?我需要volatile
嗎?我應該調用其他同步原語嗎?
通過我在C++這樣的方式,但我感興趣的答案是否爲不同C.
提前感謝。
謝謝!我可以按照你的建議使用std :: atomic,這非常好。 (我還不熟悉最新的C++ 0x)。出於好奇,如果我使用__sync_lock_test_and_set,讀取時使用的正確圍欄是什麼? (即,製作本地副本) – Steve 2010-03-20 15:23:51