【问题标题】:How to access a pointed variable directly from RAM?如何直接从 RAM 访问指向变量?
【发布时间】:2014-04-09 11:48:28
【问题描述】:

我对直接通过 RAM 访问指向变量的方法进行了一些研究,但没有成功,确保编译器不会访问已注册的副本。

int32_t* a;
void main()
{
    a = (int32_t*)malloc(4);
}

void mainBis()
{
    ???
}

如何确保以与volatile 相同的方式访问*a

谢谢

P.S.:即使这里叫mainmainBin,也只是两个不同的线程而已。

【问题讨论】:

  • main 应该返回一个int。阅读:What should main() return in C and C++?
  • 你为什么要这个?你对a 做了什么让你相信它需要特殊处理?
  • 拜托,不要只看代码,你不能说 TLDR...考虑到它不是主线程而是线程,我可以将其命名为 the_great_ping_pong_story() 没有任何改变...

标签: c++ pointers ram


【解决方案1】:

只需将a 声明为int32_t volatile * a。这样编译器就不能假设使用*a 的两个表达式是相等的,即使在两者之间没有写入对a 的更改的内存。

【讨论】:

  • 它不会只是将指向的变量标记为volatile吗?我会试一试。谢谢
  • 编译器通过指针访问变量时,不知道指针实际指向的是哪个变量,也不知道它是否是一个变量。
【解决方案2】:

您尝试使用双 = 执行的操作,== 代表相等性检查而不是分配。

a == (int32_t*)malloc(4);

应该使用单=,如:

a = (int32_t*)malloc(4);

【讨论】:

    【解决方案3】:

    这似乎是XY problem

    有点不清楚你在问什么 - 我的理解是你想从不同的线程(可能在不同的内核甚至处理器上)访问 a,所以你想确保它被写入 RAM ,而不仅仅是从寄存器中缓存或重用。对吗?

    并发是一个很大的话题,我们不知道您正在运行的系统的详细信息 - 当两个函数相互调用时。

    首先要做的是-您开始了解的是volatile 关键字。将变量声明为volatile int32_t* a; 告诉编译器它可能随时从另一个线程更改,但不能保证它在内存和缓存中的任何状态。如果已知这 2 个线程在同一个内核上运行,并且您确定您将在 @987654326 中设置它之后从a 读取数据 @。

    如果您不确定读取和写入的执行顺序,您需要进行自己的线程同步,这取决于您使用的架构和库,其工作方式会有所不同。一般来说,你会想要这样的伪代码:

    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
    }
    

    在大多数现代系统上,使用信号量之类的同步原语还可以确保线程之间的缓存一致性,因此aaIsValid 发布后的任何地方都将具有相同的值。

    【讨论】:

    • 谢谢,您确认了我不清楚的内容,因此您详细说明了信号量。奇怪的是指针和它的目标被认为是易失的,如果只有指针是的话。似乎是。我认为指针会不稳定(并发友好),但我不确定目标会是。
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多