同步和互斥的一些解答

来源:互联网 发布:ipad漫画软件 编辑:程序博客网 时间:2024/06/07 00:36

原文如下:

开头和结尾省略,问题有点多.我加个符号.

主要是有关这锁的,Unix环境高级编程里面介绍了三种锁两种锁我都犯迷糊。。
互斥锁的话主要是有关递归锁的问题,只要为互斥锁指定递归属性就成递归锁了,可以避免死锁问题,但会导致多个线程拥有同一把锁,这样的话这些线程的数据该如何同步呢?

还是说不能同步?!

这个问题现场回答.一批资源一次只让一个进程操作不让其他进程操作就OK了.这个就实现了互斥.

递归锁又有什么作用?①
互斥锁上面的条件锁主要是那个线程排队的问题,条件锁是说给定条件,在不解互斥锁的情况下等待指定队列中的进程完成处理,言外之意就是说在等待完毕之后,数据应该不受到意外的更改,不然的话直接解锁可以达到同样的效果,可是问题在于它的实现好像并不像理论那样可以解决问题,书上的实现是用两个函数来实现的:


pthread_wait等待,等待的机制是先将调用线程放到等待唤醒的队列中然后解互斥锁,而现在各种线程又可以竞争这把锁,竞争完毕之后各个线程都在获得锁之后可以有权限完成对数据的处理,也就是说调用这个函数之后原本锁上的值是不确定的,那等待的目的是什么呢?②如果仅仅等待一个条件而不保证数据不变的话这好像没有特别大的意义额


pthread_signal发送条件信号,这个函数也奇怪,应该在解锁之前发送条件信号还是解锁之后呢?如果在解锁之前,它必须保证不阻塞,但在发送信号之后接收信号的线程必须要立即在其他竞争线程醒来之前获得锁,而此时锁并没有被解开,如果系统提供优先的调度权限那还可能,但不知道有没有这样的调度实现;如果在解锁之后调用问题就显得麻烦了,一解锁就会触发竞争线程,系统可以一直保证信号发送出去就一定能在第一时间唤醒等待队列的首线程?③

现在只有三个问题了.

剩下的几个表面上有问号的问题我争取在这后两个问题内搞定.搞不定就再问.呵呵

关于同步和互斥的问题是OS的经典问题.

至于啥叫递归,这个我表面清楚:

用栈,自己调用自己.有中止条件.

实际上并不清楚.递归多少次?到哪里?每次数据是多少?我都不知道.而且没法调试.这个递归锁我是在是更不知道了.

第二个问题:为啥要加锁?

这个来源于OS的不确定性.有可能是同一个线程因为一次以上的使用时间片导致脏数据,更多的是多个线程产生了读写相关(同时读写)和写写相关(同时写).产生的脏数据.所以要加锁.保证一次操作.既然是一次操作自然导致数据不会被其他线程改变.

第三个问题:何为P?V?

PV还有不同的表述 wait和signal;

PV是中断.是优先级很高的中断.基本上没有什么能够打断它.所以加了PV的进程(线程)在一次操作内不会被中断.从而实现了加锁.

如果有信号量semaphore N=1;

cobegin;

process_i{ //i可以取123

while(1){

p(n);

do something;

v(n);}

}

coend;

下面是p操作的代码                            v操作的代码

p(n){                                                      v(n){

n--;                                                         n++

if(0<=n){ goto end; }                           if(1<=n) {goto end;}

else {进入队列;   }                              else {唤醒队列第一个等待的进程(线程);}

end:                                                      end

}                                                             }

我见到的实际上wait和signal和PV有一点点区别.PV的话有信号量大小.比如N设置为2就可以让两个进程进入.而wait和signal就不行.

希望你能满意.

原创粉丝点击