首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存模型与并发性

内存模型与并发性
EN

Stack Overflow用户
提问于 2018-08-18 20:37:02
回答 4查看 585关注 0票数 1

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

有谁能向我解释一下为什么会这样?

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

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-18 21:17:32

我理解内存模型是一种抽象,允许程序员使用编程语言对底层内存系统进行推理(对吗?)

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

我想知道C/C++内存模型,但我在所有文章、博客、youtube视频中都发现,“内存模型只需要并发性”。 有谁能向我解释一下为什么会这样?

有些规则可以被视为内存模型的一部分,这些规则也适用于单线程程序的上下文中。特别是:

  • 写入同一位置之后的读将读取写入的值,而不是旧的值。
  • 在对同一位置进行另一次写入之后的写入将覆盖先前写入的值。
  • 读取到同一位置之后的写入只会在读取完成后修改该位置。

然而,这些规则被认为是如此的基本和直观,因此不值得在每个内存模型中说明它们。对于VLIW结构,编译器会自动遵循这些规则。在传统架构中,编译器(根据源代码中语句的顺序)和处理器都遵循这些规则(根据指令流的顺序)。所以基本上,陈述它们是多余的。除此之外,对于单线程程序,没有其他有用的规则.

票数 2
EN

Stack Overflow用户

发布于 2018-08-18 20:51:08

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

票数 1
EN

Stack Overflow用户

发布于 2018-08-18 21:00:12

这是(方案编制)的引文

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

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

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

代码语言:javascript
复制
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;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51912358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档