代码之家  ›  专栏  ›  技术社区  ›  Shazly

内存模型和并发[关闭]

  •  1
  • Shazly  · 技术社区  · 6 年前

    我想知道C/C++内存模型,但我发现在所有文章、博客、YouTube视频中,“内存模型只需要并发”。

    有人能告诉我为什么会这样吗?

    我理解内存模型是一种抽象,它允许程序员使用编程语言来推理底层内存系统(正确吗?)所以一般来说(独立于编程语言)我们不需要单线程程序的内存模型吗?

    谢谢!

    4 回复  |  直到 6 年前
        1
  •  2
  •   Hadi Brais    6 年前

    我知道内存模型是一个抽象,它允许 程序员使用

    内存一致性模型是一组规则,允许程序员在程序执行过程中的任何时间点,从访问该状态的每个代理(核心)的角度来推理程序的可能状态,前提是满足某些条件(例如没有数据竞争)。

    我想知道C/C++内存模型,但我发现所有的 文章、博客、youtube视频“只需要内存模型 对于同时性。。

    有人能告诉我为什么会这样吗?

    • 对同一位置执行写入操作后的读取操作将读取写入的值,而不是旧值。
    • 读到同一位置后的写操作只会在读操作完成后修改该位置。

        2
  •  1
  •   SoronelHaetir    6 年前

    内存模型不适用于单线程代码的原因是,在ST代码中,一个接一个地执行语句,不可能混淆。在多线程代码中,对象的值可以在不警告当前线程的情况下更改。内存模型概念允许您确保在所有其他线程完成值更新之后执行特定语句,或者在任何其他线程读取对象的值之前执行特定语句。

        3
  •  1
  •   Eliyahu Machluf    6 年前

    这是引用自 https://en.wikipedia.org/wiki/Memory_model_(programming)

    内存模型允许编译器执行许多重要的优化。编译器优化,如程序中的循环融合移动语句,这可能会影响潜在共享变量的读写操作顺序。读写顺序的改变会导致竞争条件。

    编译器可以改变变量的读写顺序,并且仍然保证代码片段将像读写顺序一样运行。但是,如果涉及多线程,这可能会导致问题,因为读取/写入变量(而不是按代码顺序)可能会导致多线程相关的问题。

    检查由两个线程执行的以下代码,这两个线程都使用相同的变量init和value:

    static int init = 0;
    static int value = 0;
    
    thread_a:
    while( !init )
        Sleep( 100 );
        if ( value == 100 )
            do something ...
    
    thread_b:
        value = 100;
        init = 1;
    

    编译器可能以不同的顺序(或并行)运行线程b的代码,导致在将值设置为100之前将init设置为1。当使用单线程时,这没有任何意义,但是,当有多个线程检查此变量时,这可能会导致问题。这里的内存模型来解决这个问题。

        4
  •  1
  •   Dietmar Kühl    6 年前

    记忆模型 指执行访问对象的不同线程之间的交互。从这个意义上说,它完全依赖于并发性。这与记忆无关。

    还有一个重要的方面是 Stan Lippman’s book 是一个很好的学习资源(它有点过时,但仍然主要相关)。对象模型也没有真正讨论如何访问内存。

    What Every Programmer Should Know About Memory_ . 这篇文章是关于内存的一般观点,独立于编程语言。当然,根据对象模型的不同,不同的编程语言可能隐藏与内存的直接交互。