对线程、互斥、同步、信号量的内在关联性的简单讨论

多线程编程中,在一个程序中使用多线程,一般很少有多个线程能在其生命周期内进行完全独立的操作。这些线程共享该进程空间的内存和文件句柄资源,多个线程竞争地获得这些资源。为了防止多个线程访问资源的不一致性,就需要用到互斥量,互斥量本质上讲就是一把锁,该锁保护一个或者一些资源。一个线程如果需要访问该资源必须要获得互斥量,并对其加锁。这时如果其他线程如果想访问该资源也必须要获得该互斥量,但是锁已经加锁,所以这些进程只能阻塞,直到获得该锁的线程解锁。这时阻塞的线程里面有一个线程获得该互斥量并加锁,获准访问该资源。其他的线程继续阻塞,周而复始。

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

要实现同步和互斥这种机制,就需要使用信号量。信号量中记录着信号量的值和等待该信号量的进程队列。对信号量进行p,v操作来对资源进行加锁或释放动作。

生产者消费者同步的理论模型:

1.   生产者进行生产将物品放入仓库,同一时间只能有一个生产者将物品放入仓库,如果仓库满,生产者等待。

2.   消费者从仓库中取出物品,同一时间只能有一个消费者取出物品,如果仓库空, 消费者等待;                  

3.   生产者将物品放入仓库时消费者不能同时取;

4.   消费者取物品时生产者不能放入物品;

同步机制的关键伪代码:

Producer---生产者进程Consumer---消费者进程

Buffer:array[0....k-1]   in,out:0...k-1 -----(数据类型:integerin记录第一个空缓冲区,out记录第一个不空的缓冲区)

S1,s2,mutex:semaphore (s1控制缓冲区不满,s2控制缓冲区不空,mutex保护临界区)

初始化:s1=k,s2=0,mutex=1

 

  本文只是对对线程、互斥、同步、信号量的简单讨论,其中大部分内容均是网络收集的。

  更多关于多线程变成只是可以关注:开源文档:http://docs.huihoo.com/

  关于本文可以参考:http://www.eygle.com/digest/2004/12/osprocess_lock_latchs_emaphores.html

 

posted on 2010-12-15 19:04  springside5  阅读(168)  评论(0编辑  收藏  举报