spinlock,mutex,semaphore,critical section

critical section(临界区)

在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区包含两个操作原语: EnterCriticalSection() 进入临界区 LeaveCriticalSection() 离开临界区。

优点:速度快。因为Critical Section不是内核对象,函数EnterCriticalSection()和LeaveCriticalSection()的调用一般都在用户模式内执行。只有当想要获得的锁正好被别的线程拥有时才会退化成和Mutex一样,即转换到内核模式。

缺点:只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。

mutex(互斥器)

只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。

在这里,获得mutex的操作,就好比进入Critical Section,所以才会有文章将两者相比


定义写法


HANDLE hmtx;


CRITICAL_SECTION cs;


初始化写法


hmtx= CreateMutex (NULL, FALSE, NULL);


InitializeCriticalSection(&cs);


结束清除写法


CloseHandle(hmtx);


DeleteCriticalSection(&cs);


无限期等待的写


WaitForSingleObject (hmtx, INFINITE);


EnterCriticalSection(&cs);


0等待(状态检测)

的写法


WaitForSingleObject (hmtx, 0);


TryEnterCriticalSection(&cs);


任意时间等待的

写法


WaitForSingleObject (hmtx, dwMilliseconds);


不支持


锁释放的写法


ReleaseMutex(hmtx);


LeaveCriticalSection(&cs);

mutex一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行。

优点:可以跨进程

缺点:速度慢。Mutex 是内核对象,相关函数的执行 (WaitForSingleObject,ReleaseMutex)需要用户模式(User Mode)到内核模式(Kernel Mode)的转换,在x86处理器上这种转化一般要发费600个左右的 CPU指令周期。

semaphore(信号量)

信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目N。对于N=1的情况,称为binary semaphore。

在有的系统中Binary semaphore与Mutex是没有差异的。在有的系统上,主要的差异是mutex一定要由获得锁的进程来释放。因此建议mutex只用于保护critical section(线程间互斥)。而semaphore则用于保护某变量,或者同步。

spin lock(自旋锁)

自旋锁是专为防止多处理器并发而引入的一种锁。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

时间: 2024-10-11 12:37:13

spinlock,mutex,semaphore,critical section的相关文章

Critical Section Object

Critical Section  Object  From MSDN Critical Section Objects A critical section object provides synchronization similar to that provided by a mutex object, except that a critical section can be used only by the threads of a single process. Event, mut

spinlock,mutex,semaphore,critical section的作用与差别

某年深信服的笔试题,考的就是多线程的同步.简单的解释下方便记忆: 1.spinlock:自旋锁.是专为防止多处理器并发而引入的一种锁. 2.mutex:相互排斥量. 仅仅有拥有相互排斥对象的线程才有訪问公共资源的权限.保证了资源不会同一时候被多个线程訪问. 3.semaphore:信号量.同意多个线程同一时候訪问资源,限制訪问资源的最大线程数. 4.critical section:临界区. 随意时刻仅仅同意一个线程对共享资源进行訪问.

spinlock,mutex,semaphore,critical section的作用与区别

某年深信服的笔试题,考的就是多线程的同步,简单的解释下方便记忆: 1.spinlock:自旋锁.是专为防止多处理器并发而引入的一种锁. 2.mutex:互斥量.只有拥有互斥对象的线程才有访问公共资源的权限.保证了资源不会同时被多个线程访问. 3.semaphore:信号量.允许多个线程同时访问资源,限制访问资源的最大线程数. 4.critical section:临界区.任意时刻只允许一个线程对共享资源进行访问.

Mutex, semaphore, spinlock

Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个.一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行. Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来.对于N=1的情况,称为binary semaphore.一般的用法是,用于限制对于某一资源的同时访问. Binary semaphore与Mutex的差异:在有的系统中Binary semaphore与Mutex是没有差

Mutex, semaphore, spinlock的深度解析

Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个.一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行. Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来.对于N=1的情况,称为binary semaphore.一般的用法是,用于限制对于某一资源的同时访问. Binary semaphore与Mutex的差异: 在有的系统中Binary semaphore与Mutex是没有

windows下使用Critical Section和Mutex实现线程同步实例

利用critical section 和 Mutex两种不同的线程同步的方法实现生产者消费者问题.生产者线程要能够对一个计数器进行增的操作,并且将其输出在控制台上,消费者线程能够对这个计数器进行减的操作,并将其输出在控制台上.两种线程都共享一个计数器. 其中增.减计数器的数我设置为1-6随机. 测试两种方法的对比,用网上整理出的一张表如下 1.使用CriticalSection 方法时,有一个临界区cs 在将临界区传递给 InitializeCriticalSection 时(或者更准确地说,是

synchronization mutex &semaphore completion &example

Linux offers two kinds of semaphores: ? Kernel semaphores, which are used by kernel control paths ? System V IPC semaphores, which are used by User Mode processes struct semaphore { spinlock_t lock; unsigned int count; struct list_headwait_list; }; s

General Critical Section Problem

Once I talked about Process Synchronization, and provided a demo program of Search/Insert/Delete Problem. As a matter of fact, such Critical Section Problems have a general form: given num different types of threads, as well as all pairs of i and j s

线程系列08,实现线程锁的各种方式,使用lock,Montor,Mutex,Semaphore以及线程死锁

当涉及到多线程共享数据,需要数据同步的时候,就可以考虑使用线程锁了.本篇体验线程锁的各种用法以及线程死锁.主要包括: ※ 使用lock处理数据同步※ 使用Monitor.Enter和Monitor.Exit处理数据同步※ 使用Mutex处理进程间数据同步※ 使用Semaphore处理数据同步※ 线程死锁 □ 使用lock处理数据同步 假设有一个类,主要用来计算该类2个字段的商,在计算商的方法之内让被除数自减,即被除数有可能为零.使用lock语句块保证每次只有一个线程进入该方法. class Th