您的位置:首页 > 其它

多线程中的基本概念

2011-11-08 20:08 375 查看
Summary:

感性的总结一下多线程中的几个基本概念(容易混淆的概念)。

谈到多线程,一般人多少有点害怕,不过,在这个多核多线程的年代,甚至众核的年代,如果不能掌握一些并行多线程等相关的技术,那就说不过去了。当谈及多线程时,最基本也是经常会遇到的几个概念就是数据竞争(竞争条件)、同步、并发和并发控制、死锁(加锁)等。下面对其简要的分析,由于只是一个感性的分析,在此就不举例了。

首先说明的是,多线程的这些概念其实很多都是很普遍的概念,不仅仅存在于多线程编程中,下面只分析在多线程中的具体含义。

数据竞争(Data Race):

所谓的数据竞争,很容易理解,多个线程同时访问同一数据导致冲突(数据不正确)就产生了数据竞争。其中,“访问”包括读和写操作,所以自然,数据竞争就包括了读写竞争、写写竞争,有人会问,为何没有读读竞争,这是显然的了,同时读不会产生错误的结果。

如果需要专业一点的 说法,参考http://hi.baidu.com/baituxp/blog/item/6daa5f3770895bcba3cc2b85.html有:

Data race occurs when two conficting accesses to one shared variable are executed without proper synchronization, e.g., not protected by a common lock.

即:data race 是因为没有用足够的synchronization 来保护多个线程共享的变量,引起冲突。

竞争条件(Race Condition):

Wiki:http://en.wikipedia.org/wiki/Race_condition

百度百科:http://baike.baidu.com/view/1346461.htm

按照Wiki的说法:Race conditions arise in software when separate processes or threads of execution depend on some shared state. Operations upon shared states are critical sections that must be mutually exclusive in order to avoid harmful collision between processes
or threads that share those states.

百度百科的说法:多个线程或者进程在读写一个共享数据时结果依赖于它们执行的相对时间,这种情形叫做竞争。竞争条件发生在当多个进程或者线程在读写数据时,其最终的的结果依赖于多个进程的指令执行顺序。多个进程并发访问和操作同一数据且执行结果与访问的特定顺序有关,称为竞争条件。

总之,竞争条件和数据竞争(竞争),有了竞争条件,就可能会导致出现数据竞争,数据竞争是竞争条件被满足的最终结果(如不不满足竞争条件,竞争就不会出现了)。

竞争条件的一个典型的例子就是多个线程同时对一个变量进行自增操作,由于自增操作并不是一个指令就能完成的,包括从内存读取其值到寄存器、对值自增、将值保存会内存,一旦这三个步骤被另一个线程打断,就会导致结果可能不正确了。

同步(Synchronization):

Wiki:http://en.wikipedia.org/wiki/Synchronization

百度百科:http://baike.baidu.com/view/54180.htm

按照Wiki的解释:In computer science, especially parallel computing, synchronization refers to the coordination of simultaneous threads or processes to complete a task; in order to obtain correct runtime order and avoid unexpected race conditions.

简单理解,同步就是协调(调整)同时运行的线程或进程来完成一个任务,从而获得正确的运行时顺序,避免不期望的竞争条件

并发控制(Concurrency control):

Wiki: http://en.wikipedia.org/wiki/Concurrency_control

In information technology and computer science, especially in the fields of computer programming (see also concurrent programming, parallel programming), operating systems (see also parallel computing), multiprocessors, and databases, concurrency control
ensures that correct results for concurrent operations are generated, while getting those results as quickly as possible.

简单的说,并发控制是保证并行操作生成正确的结果的一种机制。根据我的理解,并发控制是一个广义的概念,而同步则是一个狭义的概念,或者可以说同步就是并发控制的一种具体方式(当然,并发控制的方式可能还会有其他的方式),而且在数据库中并发控制用得更为广泛,方式有很多。总之,并发控制是一个比较广泛意义上的概念,我个人习惯的理解为多线程中,一般使用同步来进行并发控制,其实,只要是进行一定的控制,保证了并行操作得到正确的结果都是并发控制的范围,比如可以进行一定的调度等,都可能会进行并发控制。

互斥(Mutex):

到这里就不得不提一下同步和互斥了,这也是经常一起出现的一个概念。通常,在操作系统中,比较读的出现这两个概念。

参考/article/5375210.html

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

所以,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。所以,可以说在多线程编程中,互斥是实现同步的方法之一。

锁(lock)和死锁(deadlock):

lock Wiki:http://en.wikipedia.org/wiki/Lock_(computer_science)

In computer science, a lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. Locks are one way of enforcing concurrency control policies.

很容易知道,锁是同步的方法之一,通过限制资源的访问来进行同步,这里也提到了,锁是进行并发控制的方法之一。学过计算机的都知道,锁有很多类型,比如读写锁、文件锁、互斥锁(Mutex)等等,但是有些是数据库或其他方面的一些概念,并不会在多线程编程中出现。总之理解一定,锁是同步的方法之一,解决同步,可以通过加锁来实现。

有了锁,就有了锁的状态,所谓的“活锁”和“死锁”,在多线程编程中,更多的听到的是说deadlock,即死锁。

deadlock: http://en.wikipedia.org/wiki/Livelock#Livelock

A deadlock is a situation where in two or more competing actions are each waiting for the other to finish, and thus neither ever does.

简单的说,死锁就是两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

总之,多线程编程经常遇到这些概念,而这些概念有时候又是在计算机的不同领域或者其它学科里都有出现,有时候更容易混淆。我的简单理解是:多于多线程编程,由于存在数据共享,多个线程可能会同时访问共享变量,就可能会导致数据竞争的出现,为了解决数据竞争,需要对程序进行并发控制或进行同步,同步的方法之一就是加锁,通过给变量加锁。如果加锁正确,那么就可以解决数据竞争的问题,但是由于锁的不正确,可能会导致死锁,要解决死锁,就需要修改锁或者删除部分锁。具体实施,就得看代码了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: