多线程编程中,在一个程序中使用多线程,一般很少有多个线程能在其生命周期内进行完全独立的操作。这些线程共享该进程空间的内存和文件句柄资源,多个线程竞争地获得这些资源。为了防止多个线程访问资源的不一致性,就需要用到互斥量,互斥量本质上讲就是一把锁,该锁保护一个或者一些资源。一个线程如果需要访问该资源必须要获得互斥量,并对其加锁。这时如果其他线程如果想访问该资源也必须要获得该互斥量,但是锁已经加锁,所以这些进程只能阻塞,直到获得该锁的线程解锁。这时阻塞的线程里面有一个线程获得该互斥量并加锁,获准访问该资源。其他的线程继续阻塞,周而复始。
说道互斥就必须说道同步。同步即是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
要实现同步和互斥这种机制,就需要使用信号量。信号量中记录着信号量的值和等待该信号量的进程队列。对信号量进行p,v操作来对资源进行加锁或释放动作。
生产者消费者同步的理论模型:
1. 生产者进行生产将物品放入仓库,同一时间只能有一个生产者将物品放入仓库,如果仓库满,生产者等待。
2. 消费者从仓库中取出物品,同一时间只能有一个消费者取出物品,如果仓库空, 消费者等待;
3. 生产者将物品放入仓库时消费者不能同时取;
4. 消费者取物品时生产者不能放入物品;
同步机制的关键伪代码:
Producer---生产者进程Consumer---消费者进程
Buffer:array[0....k-1] in,out:0...k-1 -----(数据类型:integer,in记录第一个空缓冲区,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