互斥锁mutex:一个线程获得资源,其他线程睡眠。

自旋锁spinlock:自旋锁是一种特殊的互斥锁,当资源被枷锁后,其他线程想要再次加锁,此时该线程不会被阻塞睡眠而是陷入循环等待状态(不能在做其它事情)。
这样节省了线程从睡眠状态到被唤醒期间的消耗,在加锁时间短暂的环境下会极大的提高效率。但如果加锁时间过长,则会非常浪费CPU资源

递归锁:一个线程可以多次获得该资源锁,其他线程得等多次锁用完后才能获得资源。

读写锁rwlock:它拥有读状态加锁、写状态加锁。一个线程可以占有写状态的锁,但可以有多个线程同时占有读状态锁,这也是它可以实现高并发的原因。

RCU:即read-copy-update,在修改数据时,首先需要读取数据,然后生成一个副本,对副本进行修改。修改完成后,再将老数据update成新的数据。使用RCU时,读者几乎不需要同步开销,既不需要获得锁,也不使用原子指令,不会导致锁竞争,因此就不用考虑死锁问题了。而对于写者的同步开销较大,它需要复制被修改的数据,还必须使用锁机制同步并行其它写者的修改操作。在有大量读操作,少量写操作的情况下效率非常高

信号量:semaphore,是用于线程间同步的,当一个线程完成操作后就通过信号量通知其它线程,然后别的线程就可以继续进行某些操作了。

信号量和互斥锁的区别:semaphore

信号量是用于线程间同步的,而互斥锁是用于线程的互斥的
互斥量的获取和释放都是在同一线程中完成的,pthread_mutex_lock(),pthread_mutex_unlock()。而信号量的获得和释放是在不同的线程的操作为sem_wait(),sempost();
互斥量的值只能为0和1,而信号量只要value>0,其它线程就可以sem_wait成功,成功后信号量value减一。若value值不大于0,则sem_wait阻塞,直到sem_post释放后value加1。因此信号量的值可以为非负整数


本文来自 禾夕 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u012658346/article/details/51188116?utm_source=copy
https://blog.csdn.net/u012658346/article/details/51188116/

你可能感兴趣的:(锁)