我想知道C/C++内存模型,但我在所有文章、博客、youtube视频中都发现,“内存模型只需要并发性”。
有谁能向我解释一下为什么会这样?
我理解内存模型是一种抽象,允许程序员使用编程语言对底层内存系统进行推理(对吗?)因此,一般来说(独立于编程语言),我们不需要单线程程序的内存模型吗?
谢谢!
发布于 2018-08-18 21:17:32
我理解内存模型是一种抽象,允许程序员使用编程语言对底层内存系统进行推理(对吗?)
内存一致性模型是一组规则,它允许程序员在程序执行过程中的任何时刻从访问状态的每个代理(核心)的角度来推理程序的可能状态,前提是满足某些条件(例如不进行数据竞争)。
我想知道C/C++内存模型,但我在所有文章、博客、youtube视频中都发现,“内存模型只需要并发性”。 有谁能向我解释一下为什么会这样?
有些规则可以被视为内存模型的一部分,这些规则也适用于单线程程序的上下文中。特别是:
然而,这些规则被认为是如此的基本和直观,因此不值得在每个内存模型中说明它们。对于VLIW结构,编译器会自动遵循这些规则。在传统架构中,编译器(根据源代码中语句的顺序)和处理器都遵循这些规则(根据指令流的顺序)。所以基本上,陈述它们是多余的。除此之外,对于单线程程序,没有其他有用的规则.
发布于 2018-08-18 20:51:08
内存模型不适用于单线程代码的原因是,在ST代码中,您执行一个又一个语句,不存在混淆的可能性。在多线程代码中,对象的值有可能在不向当前线程发出警告的情况下更改。内存模型概念允许您确保在所有其他线程完成更新值之后执行特定语句,或者在任何其他线程读取对象的值之前执行特定语句。
发布于 2018-08-18 21:00:12
这是(方案编制)的引文
内存模型允许编译器执行许多重要的优化。编译器优化,如程序中的循环融合移动语句,可以影响潜在共享变量的读和写操作的顺序。读和写顺序的更改会导致争用条件。
编译器可以更改变量的读和写顺序,并且仍然可以保证代码片段的运行就像读/写按顺序进行一样。然而,如果涉及多线程,这可能导致问题,因为读取/写入变量,而不是按照代码顺序,可能会导致多线程相关的问题。
检查由两个线程执行的以下代码,它们都使用相同的变量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;编译器可能以不同的顺序(或并行)运行thread_b的代码,导致init在值设置为100之前被设置为1。当使用单个线程时,这是没有意义的,但是,当多个线程检查这个变量时,这可能会导致问题。在这里,内存模型来解决这个问题。
https://stackoverflow.com/questions/51912358
复制相似问题