翻译:taowen(taowen.bitapf.org)
原文:«indy in depth» concurrency 【相关文章:为什么C#没有提供“缺省参数” 】 【扩展阅读:C#对底层数据操作的通用类】 【扩展信息:公共配置对话框】 在多线程的环境,资源必须得到保护,使得它们不会因为一次允许多于一个线程访问而受损。并发与线程是相互纠缠的问题,选择先学哪个也许很难。本文将先讲讲并发,它将为后面学习线程准备一些该先了解一下的知识。
术语
并发
并发是这样一个状态——许多task同时启动。当并发被实现得恰恰当当时,它可能被认为是“harmony”。而实现得糟糕时,就成了”chaos“。
在大部分情况中,所说的task指的都是线程。然而,task也可以是进程或者纤程。
两者之间的分界通常很清楚,而使用合适的技术才是关键
contention
确切的说何为contention?contention就是当多于一个task尝试着同时访问那独独一个资源时的情况。
如果你是在大家庭长大的孩子,可能这个比喻能很好的解释它意思。想想家里要是有六个小孩,妈妈把一块小匹萨放在桌上作为晚餐,会发生什么样的情况。那就是contention的含义。
无论何时,只要多个并发的task需要用读/写的方式访问数据,对数据的访问都必须得到控制从而保护它的完整性。如果访问没有得到控制,两个或者更多的task可能会“崩溃”。当其中的一个尝试着要读取变量时,另外一个可能要同时对它进行写入。如果一个task正在写,而另外一个正在读,那个读的task可能读取了部分写入的数据从而获得的是损坏了的数据。一般这样的操作是不会立即导致异常的,而只会在这之后给程序带来错误。
contention问题经常是在低流量的implementation中不会出现,因而在开发阶段经常是一点问题都没有。所以在开发的阶段应该采用合适的技术与压力测试。否则就有一些像玩russian roulette,问题在开发阶段仅仅是偶尔出现但是在部署阶段变成了频繁出现。
资源保护
资源保护是用来阻止由contention带来的问题的解决办法。资源保护的目的是一次仅让一个task访问指定的资源。
解决contention
无论何时,只要多个线程需要以读/写的方式访问数据,对数据的访问都必须得到控制从而保护它的完整性。这可能对于不熟悉线程操作的程序员来说intimidating。然而,大部分服务器不需要全局数据。这些程序一般在启动过程中初始化之后只需要读取数据。只要没有写操作,线程可以没有任何副作用的读
取全局数据。下面讲的是解决contention最常用的办法。
只读
最简单的办法是只读。任何简单类型(整数,字符串,内存)以只读的方式访问不需要任何保护。这也可以扩展到诸如tlists等许多复杂类型。只要它们不以读/写方式访问任何全局或者成员变量,类型在只读方式时都是安全的。
此外,资源可以在任何可能的读操作之前被改写。这允许了在读取它的task启动之前,先初始化资源。
atomic操作
有一种方法是说如果操作是atomic,资源不要被保护。atomic操作是这样一种操作,它太小了以至于不能被计算机处理器分划开来。因为它尺寸小,从而它不会受到contentiion的影响因为它将由自身执行而且在执行过程中不会有task的切换。一般情况下,atomic操作是被编译为一条汇编指令的源代码。
典型的任务诸如读取或者写入一个整型或者布尔型变量被认为是atomic操作,因为它们被编译为一条move指令。... 下一页