笔试官:请说一下linux操作系统介绍,线程间的同步方法有什么?
同一进程内的多个线程共享同一地址空间,为了防止多个线程同时访问数据引起的混乱,须要考虑线程之间的同步问题,所谓同步,即协同步调,按预定的先后顺序访问共享资源linux线程间同步方式,以免引起混乱。
线程同步的实现方法主要有6种:互斥锁、自旋锁、读写锁、条件变量、屏障、信号量。
1互斥锁。互斥锁在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量进行解锁。对互斥量加锁之后,任何其他企图再度对互斥量加锁的线程就会被阻塞,直到当前线程释放该互斥量。
2载流子锁。载流子锁与互斥量类似,但它不使线程步入阻塞态linux计划任务,而是在获取锁之前仍然占用CPU,处于忙等载流子状态。载流子锁适用于锁被持有的时间短且线程不希望在重新调度上耗费太多成本的情况。
3读写锁。读写锁有三种状态:读模式加锁、写模式加锁和不加锁,一次只有一个线程可以占有写模式的读写锁,并且多个线程可以同时占有读模式的读写锁。读写锁特别适宜对数据结构读的次数远小于写的情况。
4条件变量。条件变量容许线程睡眠,直至满足某种条件,当满足条件时,可以向该线程发送讯号,通知并唤起该线程。条件变量一般与互斥量配合一起使用。条件变量由互斥量保护,线程在改变条件状态之前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到条件的改变,由于必须在锁住互斥量以后它才可以估算条件是否发生变化。
5屏障。屏障是用户协调多个线程并行工作的同步机制。屏障容许每位线程等待,直至所有的合作线程都抵达某一点linux线程间同步方式,之后从该点继续执行。
6讯号量。讯号量本质上是一个计数器,用于为多个进程提供共享数据对象的访问。编程时可依照操作讯号量值的结果判定是否对公共资源具有访问的权限,当讯号量值小于0时,则可以访问,否则将阻塞。PV谓词是对讯号量的操作,一次P操作使讯号量减1,一次V操作使讯号量加1。