原子操作: 原子操作是由编译器来保证的,保证一个线程对数据的操作不会被其他线程打断。当线程正在对一个变量操作而这个操作过程不想被其他线程打断时,可以用原子操作,原子操作结构体(atomic_t)
原子操作缺点:会阻塞优先级很高的线程。
自旋锁:当一个线程在读写一个共享资源时,加上自旋锁,其他想要读写这个共享资源的线程就会一直处于忙等状态,循环检测保持者已经释放了锁,互斥量阻塞后休眠让出cpu,而自旋锁阻塞后不会让出cpu,会一直忙等待,直到得到锁。(重点:忙等、读写均会锁住)
读写锁:CPU内的一个结构体(rwlock_t),本质上是一个有符号整数(原子变量),初始值为2的整数次幂。当有线程对共享资源申请写操作时,先判断该值是否为初始值,如果是,则可以写入,读写锁变为0;如果不是,则无法写入。当有线程读取该共享资源时,先判断该值减1是否为负,如果是,则说明有线程在写入,读取失败,如果不为0,则可以读取,读取时此值加1,防止读取过程中有线程写入。
读写锁缺点:会造成写饥饿。(当一个线程长时间读,无法写入)
顺序锁:针对读写锁的缺点,在读取时可以写入,不必等待。只有写之间会锁住。
以上自旋锁、读写锁、顺序锁、等待锁的线程均处于忙等。会占用CPU,但实时性更强。如果不想让线程忙等,可以使用信号量。