Semaphores

2017-03-26  本文已影响0人  Fruit_初

信号量介绍



信号量的基本内容


信号量的分类

保证对临界区的互斥访问,只提供对资源的单一的访问途径

用很多可用的单位资源表示一个资源,或者说一个允许多种非同步化的并发的访问。(也就是多个线程可以同时访问)(同时访问数的上限用count定义)


信号量的语义

void P(int *semaphore) {
    while (*semaphore <= 0);
    *semaphore--;
}
void V(int *semaphore) {
    *semaphore++;
}

上述实现的操作必须是原子,但忙等其实很耗资源,所以实际信号量的实现并不是这样。

实际信号量是如下的结构:

struct Semaphore {
    int value;
    Queue q;
};

也就是有一个等待队列。mutex信号量其实很lock很像,仅仅是语义不一样。


使用信号量可能存在的问题



问题一:死锁
先看下面一段代码:
S = 1; Q = 1;
P0:P(S); P(Q); V(S); V(Q);
P1:P(Q); P(S); V(Q); V(S);
这种情况下,如果P0先抢到了S,P1先抢到了Q,则两个线程会陷入死锁


经典的同步问题——读者写者问题


由此我们引出了第二个问题:饥饿
如何写出一个不会出现饥饿问题的解法呢?


回顾信号量

上一篇 下一篇

猜你喜欢

热点阅读