操作系统

同步

2017-04-06  本文已影响6人  大海孤了岛
同步的概念
  • 协调多线程对共享数据的访问
信号量

是操作系统提供的一种协调共享资源访问的方法。

信号是一种抽象数据类型

信号量的特性:

信号量的实现:

class Semaphore{
    int sem;
    WaitQueue q;
}

Semaphore::P(){
    sem --;
    if(sem < 0){
        Add this thread t to q;
        block(t);
    }
}

Semaphore::V(){
    sem ++;
    if(sem <= 0){
        Remove a thread t from q;
        wakeup(t);
    }
}

信号量的分类:

信号量的使用:

每类资源设置为一个信号量,其初始值为1
mutex = new Semaphore();

mutex->P();
Critical Section;
mutex->V();
必须成对使用PV操作
P操作保证互斥访问临界资源
V操作保证使用后释放临界资源
PV操作不能次序错误,重复或遗漏
条件同步设置一个信号量,其初始值为0
conditon = new Semaphore(0);

假设线程A和B同时在执行,若要满足A在执行N操作前,线程B必须要完成X操作
线程A

....M....
conditon->P();
....N....


线程B

....X....
conditon->V();
....Y....

如上,若线程A先于线程B执行,那么执行到P操作,会被阻塞,直到线程B
完成X操作,执行V,信号量为1,这时A才可以继续执行下去。
管程
管程
条件变量

条件变量的实现:

Class Condition{
    int numWaiting = 0;
    WaitQueue q;
}

Condition::Wait(lock){
    numWaiting ++;
    Add this thread t to q;
    release(lock);
    schedule();
    require(lock);
}

Condition::Signal(){
    if(numWaiting > 0){
        Remove a thread t from q;
        wakeup(t);
        numWaiting --;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读