1. 信号量 - Semaphore
首先初始化信号量的值为N
线程访问资源时,首先获取信号量:
将信号量的值减1
如果信号量的值小于0,则进入等待状态,否则继续运行。
访问完资源后,线程释放信号量:
将信号量的值加1
如果信号值的值小于1,唤醒一个等待的线程。
2. 互斥量 - Mutex
资源仅同时允许一个线程访问。
与信号量不同的是,信号量可以被任意线程获取与释放。即一个线程获取了信号量后,可由另一个线程释放。而互斥量要求哪个线程获取了互斥量,哪个线程就要负责释放这个锁。
3. 临界区 - Critical Section
与信号量、互斥量不同的是,信号量和互斥量是跨进程的,即一个进程创建了信号量或互斥量,其它进程都可以合法访问该锁。而临界区的作用范围仅限于本进程。
除此之外,临界区与互斥量有相同的性质。
4. 读写锁 - Read-Write Lock
应用于读写的场合。即多线程可同时读取资源,但当有线程要修改资源时,需要进行同步。
获取锁时,有两种方式:共享的(Shared)或独占的(Exclusive),获取的行为可总结为下表所示:
读写锁状态 | 以共享方式获取 | 以独占方式获取 |
自由 | 成功 | 成功 |
共享 | 成功 | 失败 |
独占 | 失败 | 失败 |
5. 条件变量
线程可以等待条件变量,一个变量可以被多个线程等待。
线程可以唤醒条件变量,此时某个或所有等待此变量的线程都会被唤醒并继续运行。