课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习计算机编程开发技术,下面我们就通过案例分析来了解一下,多线程编程开发需要掌握哪些知识。
大多数现代多线程编程语言都可以避免顺序一致性与性能之间的冲突,因为它们知道:
顺序一致性的问题是由于某些程序转换引起的,例如我们的例子中交换了无关变量的访问顺序,这不会改变单线程程序的意图,但是会改变多线程程序的意图(例如例子中允许r1和r2都为0)。
只有当代码允许两个线程同时访问相同的共享数据,并且是以某种冲突的方式访问时(例如当一个线程读取数据的同时另一个线程写入该数据),才有可能察觉到这种程序转换。如果程序强制以特定顺序来访问共享变量,那么我们就无法判断对独立变量的访问是否被重排序,就如同在单线程程序中也无法判断。
无限制地同时访问普通共享变量会让程序变得难以处理,一般需要避免这种情况。坚持完全的顺序一致性对我们没有好处。我们将在下文用单独的一节来讨论这个问题。
因此编程语言通常会提供方便的机制来限制通过不同的线程同时访问变量,并且仅当不存在不受控的并发访问时(例如我们的示例程序)才保证顺序一致性。更准确地说:
如果两个普通内存操作访问相同的内存位置(例如变量、数组元素),并且至少一个内存操作写入该存储单元,则称这两个内存操作是冲突的。
如果程序存在顺序一致的执行,则称其允许在特定输入集合上有数据竞争(datarace),即在线程操作的交错执行中两个冲突的操作可以“同时”执行。为了我们的目的,如果两个操作在交错执行中相邻,并对应不同的线程,则这两个操作可以被“同时”执行。如果两个对应不同线程的常规内存操作在交错执行中相邻,我们知道如果他们以相反顺序执行也会得到相同结果;如果一些操作强制了顺序,则他们就必须要在交错执行中间出现。因此模型中的相邻实际上意味着他们本应该在真正的并发模型中同时发生。
仅当程序避免了数据竞争时我们才保证顺序一致性。
这种保证是Java和下一代C++标准的线程编程模型的核心。
注意本文简介中的例子确实有数据竞争,至少当变量x和y是普通整型变量时是这样。
大多数现代编程语言都提供了简单的方法来指定同步变量(synchronizationvariables)用于在线程间通信,同步变量是特意用来进行并发访问的。这种形式的并发访问不被认为是数据竞争。换言之,只要当冲突的并发访问仅发生在同步变量上时,就能确保顺序一致性。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。