Chinaunix首页 | 论坛 | 博客
  • 博客访问: 330748
  • 博文数量: 67
  • 博客积分: 2485
  • 博客等级: 大尉
  • 技术积分: 665
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-20 17:29
文章分类

全部博文(67)

文章存档

2016年(3)

2013年(5)

2012年(3)

2011年(5)

2010年(35)

2009年(16)

我的朋友

分类: LINUX

2010-04-28 15:20:47

在多线程编程中,经常使用到如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被释放。
阅读(4380) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~