互斥锁(mutex,互斥量)
互斥锁是用于控制多个线程对他们之间共享资源互斥访问的一个信号量。
互斥锁属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程A和B,它们分别运行在core 0和core 1上。假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持有,那么线程A就会被阻塞,此时会通过上下文切换将线程A置于等待队列中,此时core 0就可以运行其他的任务(如线程C)。
条件锁(cond,条件变量)
条件锁就是所谓的条件变量,某一个线程因为某个条件为满足时可以使用条件变量使改程序处于阻塞状态。一旦条件满足以“信号量”的方式唤醒一个因为该条件而被阻塞的线程。最为常见就是在线程池中,起初没有任务时任务队列为空,此时线程池中的线程因为“任务队列为空”这个条件处于阻塞状态。一旦有任务进来,就会以信号量的方式唤醒一个线程来处理这个任务,这个过程中就使用到了条件变量。
互斥锁实现的是线程的互斥,条件锁实现的是线程的同步。
自旋锁(spin)
自旋锁属于busy-waiting类型的锁,当线程A请求自旋锁,如果自旋锁已经被线程B所持有,那么线程A就会一直在core 0上进行忙等待并不停的进行锁请求,检查该自旋锁是否已经被线程B释放,直到得到这个锁为止。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远高于互斥锁。
读写锁
可以有多个读线程同时获取读的锁,而只有一个线程可以获取写的锁。读锁和写锁互斥,写锁和写锁互斥。
线程锁POSIX
Welcome to my other publishing channels