联系我:新浪微博@阳光下的云朵2012或者zhangcaiyun_86#163.com(将#换成@)

读书笔记4(续)-----Linux中多线程同步方式

上一篇 / 下一篇  2013-05-24 16:49:10 / 个人分类:linux

    典型的UNIX系统都支持一个进程创建多个线程(thread)。在Linux进程基础中提到,Linux以进程为单位组织操作,Linux中的线程也都基于进程。尽管实现方式有益于其它的UNIX系统,但Linux的多线程在逻辑和使用上与真正的多线程并没有差别。
   1.多线程
    在LInux从程序到进程中,我们看到了一个程序在内存中的表示。这个程序的整个运行过程中,只有一个控制权的存在。当函数被调用的时候,该函数获得控制权,成为激活(active)函数,然后运行该函数中的指令。与此同时,其他的函数处于离场状态,并不运行。
    多线程就是允许一个进程存在多个控制权,以便让多个函数同时处于激活状态,从而让多个函数的操作同时运行。即使是单CPU的计算机,也可以通过不停的在不同线程的指令间切换,从而造成多线程同时运行的效果。
  2.多线程同步(synchronization)
    对于多线程程序来说,同步是指在一定的时间内只允许某一个线程访问某个资源。而在此时间内,不允许其他的线程访问该资源。我们可以通过互斥锁(mutex),条件变量(condition cariable)读写锁(reader-writer lock)来同步资源。
 1)mutex 是一个特殊的变量,它有锁上(lock)和打开(unlock)两个状态。mutex一般被设置成全局变量。打开的mutex可以由某个线程获得。一旦获得,这个mutex会锁上,此后只有该线程有权打开。其它想要获得mutex的线程,会等待直到mutex再次打开的时候。我们可以将mutex想象成为一个只能容纳一个人的洗手间,当某个人进入洗手间的时候,可以从里面讲洗手间锁上。其它人只能在mutex外面等待那个人出来,才能进去。在外面等候的人并没有排队,谁先看到洗手间空了,就可以首先冲进去。
2)condition variable
    condition variable是另一种常用的变量,它也常常被保存为全局变量,并和mutex合作。condition variable特别适用于多个线程等待某个条件的发生。如果不使用condition variable,那么每个进程就需要不断尝试获得mutex并检查条件是否发生,这样大大浪费了系统的资源。
3)reader-writer lock
    Reader-writer lock 与mutex非常相似。r、rw lock有三种状态:共享读取锁(shared-read),互斥写入锁(exclusive-write lock),打开(unlock)。后两种状态与之前的mutex两种状态完全相同。
    一个unlock的RW lock可以被某个进程获取R锁或者W锁。
    如果被一个进程获得R锁,RW lock可以被其他进程继续获得R锁,而不必等待该进程释放R锁。但是,如果此时有其他进程想要获得W锁,它必须等到所有持有共享读取锁的进程释放掉各自的R锁。
    如果一个锁被一个进程获得W锁,那么其他进程,无论是想要获取R锁还是W锁,都必须等待该进程释放W锁。
    这样,多个进程就可以同时读取共享资源。而具有危险性的写入操作得到了互斥锁的保护。
    我们需要同步并发系统,这为程序员编程带来了难度。但是多线程系统可以焊好的解决许多IO瓶颈的问题。比如我们监听网络端口。如果我们只有一个线程,那么我们必须监听,接收请求,处理,回复,再监听。如果我们使用多线程系统,则可以让多个线程监听。当我们的某个线程进行处理的时候,我们还可以有其他的线程继续监听,这样,就大大提高了系统的利用率。在数据越来越大,服务器读写操作越来越多的今天,这具有相当的意义。多线程还可以更有效地利用多CPU的环境。
 
作者:Vamei 
出处:http://www.cnblogs.com/vamei/archive/2012/10/09/2715393.html欢迎转载,请注明出处,谢谢。

TAG:

 

评分:0

我来说两句

Open Toolbar