线程同步
线程同步分为线程互斥和线程通信。
线程互斥:
主要是通过互斥锁(会有用户态与内核态之间的切换)实现的,对于一些比较轻的操作比如++--之类的可以使用原子锁,在内存与寄存器层面上实现++--操作,这个操作不会影响线程的状态,因此效率更高。
线程同步:
主要是通过条件变量(+互斥锁)和信号量实现的。
条件变量(+互斥锁)的控制更加精细,比如对于生产者消费者问题中可以实现两种场景,场景一:先生产后消费;场景二:生产一个消费一个;而信号量对于这种问题只能实现场景一,也就是说它实现粗略的线程通信。因此如果要实现精细的线程通信我们考虑用条件变量(+互斥锁),如果只是考虑一个线程需要依赖于另外一个线程实现我们推荐用信号量。此外信号量作为C++20新特性的提供的一种语法,可以由C++11新特性里的条件变量+互斥锁实现。此外,从某种意义上来讲,互斥锁就相当于一个二元信号量,区别在于信号量不能实现线程互斥,因为线程互斥必须只要抢到锁的线程才可以释放锁,而对于信号量来讲可以由其他线程进行post操作。