天天看点

多线程中Semaphore,mutex和lock的区别

下午考并行计算了,一直对这几个概念比较模糊,区分的不太开。将找到的资料帖上来,以后可以提醒一下自己。

1. A lock allows only one thread to enter the part thats locked and the lock is not shared with any other processes , a mutex is the same as a lock but system wide and a semaphore does the same as a lock but allows x number of threads to enter...

==========================================================

原文链接:http://koti.mbnet.fi/niclasw/MutexSemaphore.html

2.

Mutex:

Is a key to a toilet. One person can have the key - occupy the toilet - at the time. When finished, the person gives (frees) the key to the next person in the queue.

Officially: "Mutexes are typically used to serialise access to a section of  re-entrant code that cannot be executed concurrently by more than one thread. A mutex object only allows one thread into a controlled section, forcing other threads which attempt to gain access to that section to wait until the first thread has exited from that section."

Ref: Symbian Developer Library

(A mutex is really a semaphore with value 1.)

Semaphore:

Is the number of free identical toilet keys. Example, say we have four toilets with identical locks and keys. The semaphore count - the count of keys - is set to 4 at beginning (all four toilets are free), then the count value is decremented as people are coming in. If all toilets are full, ie. there are no free keys left, the semaphore count is 0. Now, when eq. one person leaves the toilet, semaphore is increased to 1 (one free key), and given to the next person in the queue.

Officially: "A semaphore restricts the number of simultaneous users of a shared resource up to a maximum number. Threads can request access to the resource (decrementing the semaphore), and can signal that they have finished using the resource (incrementing the semaphore)."

Ref: Symbian Developer Library

=========================================================

3.原文链接:http://www.allinterview.com/showanswers/75092.html

这里讲的spinlock和lock是不一样的概念。

Kernel Locking Techniques

Semaphores in Linux are sleeping locks. Because they cause a

task to sleep on contention, instead of spin, they are used

in situations where the lock-held time may be long.

Conversely, since they have the overhead of putting a task

to sleep and subsequently waking it up, they should not be

used where the lock-held time is short. Since they sleep,

however, they can be used to synchronize user contexts

whereas spinlocks cannot. In other words, it is safe to

block while holding a semaphore. 



A "mutex" (or "mutual exclusion lock") is a signal that two

or more asynchronous processes can use to reserve a shared

resource for exclusive use. The first process that obtains

ownership of the "mutex" also obtains ownership of the

shared resource. Other processes must wait for for the first

process to release it's ownership of the "mutex" before they

may attempt to obtain it.



The most common locking primitive in the kernel is the

spinlock
. The spinlock is a very simple single-holder lock.

If a process attempts to acquire a spinlock and it is

unavailable, the process will keep trying (spinning) until

it can acquire the lock. This simplicity creates a small and

fast lock.      

继续阅读