您的位置:首页 > 其它

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

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

/*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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: