免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3339 | 回复: 0
打印 上一主题 下一主题

mutex和semaphore的区别,转载 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-21 16:41 |只看该作者 |倒序浏览
http://kb.vigal.net/semaphore-mutex-relatio/

  • Home
    About Wizard Ray

           
                           
                   
                            « 在复杂逻辑中尽量使用短小的方

                            FCKEditor
    在ASP.NET下的部署笔记 »
                   
                   
                           
    Semaphore与Mutex的关系
                            2009/07/13, 13:03
                           
                                   
    在多线程编程中,经常使用到如Semaphore或Mutex等许多线程间同步用的工具,但是Mutex和Semaphore的区别一直让
    人困惑在Pintos Project的实践中,逐渐摸索到一些其中的区别。以下的实现来自Pintos Project。
    一、Semaphore
    1. 信号量是一个非负整数,具有两种原子操作:
    a. P操作:也称Down操作。等待信号量变为正数,而后减少信号量;
    b. V操作:也称Up操作。增加信号量,唤醒等待队列中的进程。
    /* A counting semaphore. */
    struct semaphore
    {
        unsigned value;              /* Current value. */
        struct list waiters;           /* List of waiting threads. */
    };
    void sema_init (struct semaphore *sema, unsigned value)
    {
        ASSERT (sema != NULL);
        sema->value = value;
        list_init (&sema->waiters);
    }
    2. P操作:
    P操作等待信号量的值变为正数,而后减少信号量的值,并将此进程列入等待进程列表,阻塞当前进程
    void sema_down (struct semaphore *sema)
    {
        enum intr_level old_level;
        ASSERT (sema != NULL);
        ASSERT (!intr_context ());
        old_level = intr_disable ();
        while (sema->value == 0)
        {
            list_push_back (&sema->waiters, &thread_current ()->elem);
            thread_block ();
        }
        sema->value--;
        intr_set_level (old_level);
    }

    3. V操作:
    V操作增加信号量的值,并从等待队列中,去除队列顶部的进程,唤醒其继续执行
    void sema_up (struct semaphore *sema)
    {
        enum intr_level old_level;
        ASSERT (sema != NULL);
        old_level = intr_disable ();
        if (!list_empty (&sema->waiters))
            thread_unblock (list_entry (list_pop_front (&sema->waiters),
        struct thread, elem));
        sema->value++;
        intr_set_level (old_level);
    }
    二、Mutex
    在Pintos Project中,Mutex用Lock实现。
    1. 一个Lock被确定的一个线程拥有,只有拥有者线程才能操作Lock:
    /* Lock. */
    struct lock
    {
        struct thread *holder;               /* Thread holding lock (for debugging). */
        struct semaphore semaphore;  /* Binary semaphore controlling access. */
    };
    void lock_init (struct lock *lock)
    {
        ASSERT (lock != NULL);
        lock->holder = NULL;
        sema_init (&lock->semaphore, 1);
    }
    2. Acquire操作:
    请求一个Lock,该Lock必须由当前线程拥有。使得当前线程进入挂起状态,直到该Lock被释放。
    void lock_acquire (struct lock *lock)
    {
        ASSERT (lock != NULL);
        ASSERT (!intr_context ());
        ASSERT (!lock_held_by_current_thread (lock));
        sema_down (&lock->semaphore);
        lock->holder = thread_current ();
        printf("%d", &thread_current().priority);
    }
    3. Release操作:
    释放一个Lock,该Lock必须由当前线程拥有。
    void lock_release (struct lock *lock)
    {
        ASSERT (lock != NULL);
        ASSERT (lock_held_by_current_thread (lock));
        lock->holder = NULL;
        sema_up (&lock->semaphore);
    }
    三、区别和联系
    1. 初始状态不一样:Mutex的初始值是1(表示锁可用),而Semaphore的初始值是0,随后的操作基本一
    样。
    2.
    用法不一样:Mutex的使用者必须为同一个线程,即必须成对使用。而Semaphore可以由不同的线程进行P和V操作,即可以由一个线程不停的P一个
    资源,而另一个线程不停地V一个资源,故可以应用于生产者-消费者模型等资源同步的场合。因此,Mutex又不同于一个二值的Semaphore。
                                                           
                   
                   
                   

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/105041/showart_2183414.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP