设为首页 加入收藏

TOP

解决多线程代码中的 11 个常见的问题(四)
2011-12-24 22:53:38 】 浏览:4291
Tags:解决 线程 代码 常见 问题
 

纯度
即使是使用固定不变的数据类型,程序所执行的大部分操作仍是方法调用。方法调用可能存在一些副作用,它们在并发代码中会引发问题,因为副作用意味着某种形式的变化。通常这只是表示写入共享内存,但它也可能是实际变化的操作,如数据库事务、Web 服务调用或文件系统操作。在许多情况下,我希望能够调用某种方法,而又不必担心它会导致并发危险。有关这一方面的一些很好示例就是 GetHashCode 和 ToString on System.Object 等简单的方法。很多人都不希望它们带来副作用。
纯方法始终都可以在并发设置中运行,而无需添加同步。尽管纯度没有任何常见语言支持,但您可以非常简单地定义纯方法:
  1. 它只从共享内存读取,并且只读取不变状态或常态。
  2. 它必须能够写入局部变量。
  3. 它可以只调用其他纯方法。
因此,纯方法可以实现的功能非常有限。但当与不变类型结合使用时,纯度就会成为可能而且非常方便。一些函数式语言默认情况下都采用纯度,特别是 Haskell,它的所有内容都是纯的。任何需要执行副作用的内容都必须封装到一个被称为 monad 的特殊内容中。但是我们中的多数人都不使用 Haskell,因此我们必须遵照纯度约定。

隔离
前面我们只是简单提及了发布和私有化,但它们却击中了一个非常重要的问题的核心。由于状态通常在多个线程之间共享,因此同步是必不可少的(不变性和纯度也很有趣味)。但如果状态被限制在单个线程内,则无需进行同步。这会导致软件在本质上更具伸缩性。
实际上,如果状态是隔离的,则可以自由变化。这非常方便,因为变化是大部分 C 风格语言的基本内置功能。程序员已习惯了这一点。这需要进行训练以便能够在编程(www.cppentry.com)时以函数式风格为主,对大多数开发人员来说这都相当困难。尝试一下,但不要自欺欺人地认为世界会在一夜之间改为使用函数式风格编程(www.cppentry.com)。
所有权是一件很难跟踪的事情。对象是何时变为共享的?在初始化时,这是由单线程完成的,对象本身还不能从其他线程访问。将对某个对象的引用存储在静态变量中、存储在已在线程创建或排列队列时共享的某个位置或存储在可从其中的某个位置传递性访问的对象字段中之后,该对象就变为共享对象。开发人员必须特别关注私有与共享之间的这些转换,并小心处理所有共享状态。

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇大文件重定向和管道的效率对比 下一篇Linux下多路复用IO接口 epoll sel..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目