为什么需要线程同步?
为了对共享资源的访问进行保护。 大概就是为了防止一个全局变量同时被两个线程修改,发生冲突。
1.互斥锁
本质上说是一把锁,在访问共享资源之前对互斥锁进行上锁,在访问完成后释放互斥锁(解锁);对互斥锁进行上锁之后,任何其它试图再次对互斥锁进行加锁的线程都会被阻塞,直到当前线程释放互斥锁。
互斥锁死锁:一个线程试图对同一个互斥锁加锁两次,该线程会陷入死锁状态,一直被阻塞永远出不来
2.条件变量
用于自动阻塞线程,直到某个特定事件发生或某个条件满足为止,通常情况下,条件变量是和互斥锁一起搭配使用的。
主线程作为“生产者”,新创建的线程作为“消费者”
比如满足条件时,调用pthread_cond_wait:这个线程调用此函数会自动释放持有的互斥锁 mutex,并进入等待状态,进而去实现另一个线程
3.自旋锁
4.读写锁
当处于写加锁状态时,在这个锁被解锁之前,所有试图对这个锁进行加锁操作(不管是以读模式加锁还是以写模式加锁) 的线程都会被阻塞。
当处于读加锁状态时,所有试图以读模式对它进行加锁的线程都可以加锁成功。这个状态里只有对变量进行读操作,不改变变量并不会有冲突。