进程间与mutex和信号量同步

时间:2012-03-22 20:32:31

标签: multithreading mutex semaphore

我正在对操作系统进行自学。 Tanenbaum在他的书现代操作系统中陈述了一个例子,他解释了三个信号量(其中一个是互斥体)如何协调生产者 - 消费者过程对。我抓住它没什么困难。任何人都可以解释它是如何实现的。任何帮助将不胜感激。感谢。

    #define N 1 00
    typedef int semaphore;
    semaphore mutex = 1 ;
    semaphore empty = N;
    semaphore full = 0;
    void producer(void)
    {

    int item;
    while (TRUE) {
    item = produce_item( );
    down( &empty);
    down( &mutex);
    inserUtem(item);
    up(&mutex);
    up(&full);
}

    void consumer(void)
    {

    int item;
    while (TRUE) {
    down(&full);
    down( &mutex);
    item = remove_ item( );
    up(&mutex);
    up(&empty);
    consume_item(item);

}

1 个答案:

答案 0 :(得分:0)

(互斥锁)semahore初始化为1.只有一个线程可以获得这个单元,所有其他线程都被阻止。它的唯一目的是防止任何类型的多个线程访问队列&所以确保典型的队列实现是线程安全的。

一个信号量(完整)被初始化为零并计算队列中的项目数。

一个信号量(空)被初始化为队列长度并计算队列中的空闲空间数。

真的是这样的。要打开一个对象,首先等待(空)以确保有一个空闲空间,然后等待(互斥)以获得对队列的访问,推送对象,(是的,总会有一个空间可用 - 无需检查队列计数),信号(互斥)解锁队列,最后发信号(完整),以便任何等待或稍后会出现的消费者线程可以获得表示队列中对象的单元

要关闭对象,首先等待(完全)以确保队列中有一个对象,然后等待(互斥)以访问队列,弹出对象,(是的,总会有成为队列中的一个对象 - 无需检查队列计数),信号(互斥锁)解锁队列,最后发出信号(空),这样任何正在等待或稍后会出现的生成器线程都可以得到一个单元表示队列中的空闲空间。

这是计算机科学101的东西 - 绝对经典的生产者 - 消费者阻止队列。