In my project of sina spider as well as the course of Operating System, I come up with the use of Semaphore and Mutex, I make a note here for my study and my work.

Definition

In computer science, a semaphore is a variable or abstract data type provides a simple but useful abstraction controlling access by multiple processes to a common resource in a parallel programming environment.

Semaphores are a useful tool in the prevention of race conditions; however, their use is by no means a guarantee that a program is free from these problems. Semaphores which allow an arbitrary resource count are called counting semaphores, while semaphores which are restricted to the values 0 and 1 (or locked/unlocked, unavailable/available) are called binary semaphores (same functionality that mutexes have).

 

P & V:

operation P:

//apply for a resource

Semaphore--;

//if allocation fails, the process sleeps

if(Semaphore < 0)

        sleep();

operation V:

//release a resource

Semaphore++;

//if resource is avaliable, wake up a process

if(Semaphore > 0)

          wakeupaprocess() 

 

Semaphore vs. mutex

A mutex is essentially the same thing as a binary semaphore, and sometimes uses the same basic implementation. However, the term "mutex" is used to describe a construct which prevents two processes from accessing a shared resource concurrently. The term "binary semaphore" is used to describe a construct which limits access to a single resource.

In many cases a mutex has a concept of an "owner": the process which locked the mutex is the only process allowed to unlock it. In contrast, semaphores generally do not have this restriction, something the producer-consumer example above depends upon.

 

Example 1: A Mutex Example

Description:

      There is a classroom , if a student enters it, variable 'conunt' increases by 1, and if a student exits it, variable 'conunt' decreases by 1.

Solution:

      Initialize mutex = 1

      Enter:

      P(mutex)

  count++

  V(mutex)

  Exit:

      P(mutex)

  count--

  V(mutex)

 

Example 2: Use in my Crawler 

Description:

In one of my Crawler for Sina microblog, I use parallel programming and there is a UID stack that need to be locked while one thread is visiting it, and when the top element of UID stack is poped out, the lock can be released. So I used the Semaphore to deal with it.

Solution:

      Initialize mutex = 1

      With the control of UID Stack:

      P(mutex)

  UIDStack.top()

  UIDStack.pop()

  V(mutex)

 posted on 2012-06-27 11:19  Jiang, X.  阅读(232)  评论(0编辑  收藏  举报