线程的竞争
竞争产生的原因:多个线程对同一个变量进行+1操作,如果线程A对变量先读后写的过程中,线程切换到B,B对变量进行+1后,切换回A,但是A是按照之前读的变量值进行+1再赋值给变量,所以相当于B没进行+1。
(进程也会产生竞争,比如进程之间通信时,通过共享内存会导致竞争)
常见的锁
(1)互斥锁
(2)读写锁
当有读锁时,写锁无法获得,防止别的线程在读,你突然写了,久会导致数据出现问题
如果使用的宏定义初始化锁,不需要使用unlock销毁读写锁
读写锁是互斥的,这就会导致存在一个问题,写饥饿
就是当写锁想要获取时,读锁一直在不停的获取,这就会导致写锁卡住。
解决方法就是:
(3)自旋锁
(4)条件变量
就是线程在获取锁和解锁这个过程中,他想要释放锁,比如写线程的buffer满了,想短暂的释放锁,让读线程来清理buffer,引入了条件变量机制。其实就是在中间加个条件变量,然后堵塞该线程,直到别的线程通过该条件变量来唤醒。主要还是线程锁是采用争抢机制的,你无法按照你想的流程来进行,引入条件变量就好很多。
(5)信号量
信号量可以用来解决进程间同步问题,通过共享内存,将sem_t这个信号量映射,所有的进程都可以看到
有名信号量
线程池:
具体api线程池b站尚硅谷
线程池好像就是专门创建指定数量得线程,都执行同一个任务,但是可以给线程池传递参数,让其实现不同的功能。