对线程、互斥、同步、信号量的内在关联性的简单讨论
2010-12-15 19:04
176 查看
多线程编程中,在一个程序中使用多线程,一般很少有多个线程能在其生命周期内进行完全独立的操作。这些线程共享该进程空间的内存和文件句柄资源,多个线程竞争地获得这些资源。为了防止多个线程访问资源的不一致性,就需要用到互斥量,互斥量本质上讲就是一把锁,该锁保护一个或者一些资源。一个线程如果需要访问该资源必须要获得互斥量,并对其加锁。这时如果其他线程如果想访问该资源也必须要获得该互斥量,但是锁已经加锁,所以这些进程只能阻塞,直到获得该锁的线程解锁。这时阻塞的线程里面有一个线程获得该互斥量并加锁,获准访问该资源。其他的线程继续阻塞,周而复始。
说道互斥就必须说道同步。同步即是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
要实现同步和互斥这种机制,就需要使用信号量。信号量中记录着信号量的值和等待该信号量的进程队列。对信号量进行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
说道互斥就必须说道同步。同步即是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
要实现同步和互斥这种机制,就需要使用信号量。信号量中记录着信号量的值和等待该信号量的进程队列。对信号量进行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
/*producer(生产者进程):*/ Item_Type item; { while (true) { produce(&item); p(s1); p(mutex); buffer[in]:=item; in:=(in+1) mod k; v(mutex); v(s2); } } /*consumer(消费者进程):*/ Item_Type item; { while (true) { p(s2); p(mutex); item:=buffer[out]; out:=(out+1) mod k; v(mutex); v(s1); consume(&item); } }
本文只是对对线程、互斥、同步、信号量的简单讨论,其中大部分内容均是网络收集的。
更多关于多线程变成只是可以关注:开源文档:http://docs.huihoo.com/
关于本文可以参考:http://www.eygle.com/digest/2004/12/osprocess_lock_latchs_emaphores.html
相关文章推荐
- 对线程、互斥、同步、信号量的内在关联性的简单讨论
- 线程间同步--互斥锁、条件变量、信号量
- 信号量------线程的同步与互斥
- linux c 线程间同步(通信)的几种方法--互斥锁,条件变量,信号量,读写锁
- 线程间的同步与互斥—信号量
- 同步事件,信号量,互斥,临界区,线程,线程池C++实现(win32,linux)
- 线程间同步--互斥锁、条件变量、信号量
- 唯快不破:线程间同步--互斥锁、条件变量、信号量
- Linux利用信号量实现线程的同步与互斥
- Linux线程浅析[线程的同步和互斥之线程信号量]
- 线程的同步与互斥:条件变量&信号量
- 进程与线程;同步与互斥:事件,信号量,临界区,互斥量
- Unix高级编程:线程的同步之信号量、进程通信之信号量集、system函数、简单web服务器代码
- 讲Linux下面线程的操作、多线程的同步和互斥相关函数及操作的文章链接
- Linux多线程编程之同步对象编程:线程信号量
- 一个简单的C#多线程间同步的例子 (转)
- Linux 进程与线程的同步与互斥
- Unix,进程,线程,同步,互斥,通信
- Linux下面线程的操作、多线程的同步和互斥
- 多线程六 经典线程同步之信号量Semaphore