如何直接从RAM访问指向变量
How to access a pointed variable directly from RAM?
我对直接通过RAM访问指向变量的方法进行了一些研究,但没有成功,因为我确信编译器不会访问注册的副本。
int32_t* a;
void main()
{
a = (int32_t*)malloc(4);
}
void mainBis()
{
???
}
如何确保以与volatile
相同的方式访问*a
?
感谢
附言:即使它在这里被称为main
和mainBin
,它也只是两个不同的线程。
只需将a
声明为int32_t volatile * a
。这样,编译器就不能假设使用*a
的两个表达式是相等的,即使在这两个表达式之间没有写入对a
的更改的内存。
您尝试使用double=,==来执行的操作表示相等性检查,而不是赋值。
a == (int32_t*)malloc(4);
应在中使用single=
a = (int32_t*)malloc(4);
这似乎是一个XY问题。
现在还不清楚你在问什么——我的理解是,你想从不同的线程(可能在不同的内核甚至处理器上)访问a
,所以你想确保它被写入RAM,而不仅仅是从寄存器缓存或重用。是这样吗?
并发性是一个很大的话题,我们不知道你正在运行的系统的细节——当这两个函数被相对于彼此调用时。
首先,您开始了解volatile
关键字。将变量声明为volatile int32_t* a;
告诉编译器它可能随时从另一个线程更改,但不能保证它在内存和缓存中的状态。如果已知这两个线程在同一个内核上运行,并且您确信在main()
中设置了它之后,您将从a
中读取。
如果你不确定读&write将执行,您需要进行自己的线程同步,这取决于哪种体系结构&您正在使用的库。一般来说,你会想要这样的伪代码:
int32_t* a;
semaphore_t aIsValid;
void main()
{
a = (int32_t*)malloc(4);
signal_semaphore(aIsValid);
}
void mainBis()
{
wait_for_semaphore(aIsValid);
// read from a
}
在大多数现代系统上,使用信号量等同步原语也可以确保线程之间的缓存一致性,因此a
在aIsValid
发布后的所有地方都具有相同的值。
相关文章:
- 从不同C++类的成员变量访问成员函数
- 在主函数中C++私有变量访问
- 互锁变量访问(在布尔值上)和 std::atomic_flag 之间的区别
- C++中的变量访问内联函数
- 无法使用子类变量访问超类公共成员
- 优化成员变量访问
- Ifstream:打开可使用变量访问的文件
- 使用'this->'成员变量访问的性能
- 从成员变量访问静态 constexpr 成员,GCC 错误?
- TLS变量访问的结果未缓存
- 通过const成员变量访问内联函数
- 获取通过环境变量访问的文件的位置
- 静态变量访问
- 从函数变量访问结构变量的成员
- 从另一个变量访问变量
- 使用变量访问结构中的任何数据
- 如何使用另一个变量访问对象的变量/方法
- 使用用户变量访问结构的成员?C++
- 我需要通过基类静态变量访问派生类成员
- 如何将一个文件中存在的全局常量变量访问到另一个文件