我想验证我的理解是否正确。这种事情很棘手,所以我几乎可以肯定我错过了一些东西。我有一个由实时线程和非实时线程组成的程序。我希望非 RT 线程能够交换指向 RT 线程使用的内存的指针。
从文档中,我的理解是这可以通过以下方式完成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 的答案是否不同感兴趣。
提前谢谢。