四种线程间同步的方法及两种进程间同步的方法

 

 

线程间同步之互斥量:

即线程A访问邻接资源时,阻止线程B访问。互斥量(互斥锁)保证两个线程指令的先后顺序执行。具有原子性(一系列操作不可以被中断,不存在部分执行部分未执行的情况)。互斥锁是最简单的线程同步方法,有加锁和解锁两种状态,

两个状态可以保证资源访问的串行。 同时,操作系统直接提供了互斥量的API,开发者可以直接使用API完成资源的加锁、解锁操作。   线程间同步之自旋锁: 自旋锁的原理和互斥锁相同。使用自旋锁的线程会反复检查锁变量是否可用,自旋锁不会让出CPU,而是处于忙等待状态(一直死循环等待CPU释放) 优点:自旋锁避免了进程或者上下文切换的开销,同时操作系统本身很多地方都使用了自旋锁。 但是自旋锁不适合单核CPU。 自旋锁和互斥锁有什么区别呢? 比如线程1调用线程2占有的临界资源(线程2持有自旋锁)那么线程1会一直请求直到临界资源释放,而互斥锁会让线程1休眠,置入请求队列中去。   线程间同步之读写锁 在实际生产中,临界资源往往面临的情况是多读少些,即读时并不改变临界资源的值。 读写锁是一种特殊的自旋锁 允许多个读者同时访问资源以提高读性能 对于写操作则是互斥的,即读-写互斥,写-写互斥,而对于读-读操作,不互斥。读写锁对于多读少写的场景性能提升非常大。   线程间同步之条件变量 条件变量是一种相对复杂的线程同步方法 条件变量允许线程睡眠,直到满足某种条件 当满足条件时,可以向该线程信号,通知唤醒,往往配合互斥锁使用。  

 

 

使用fork系统调用创建进程。

fork系统调用是用于创建进程的 fork创建的进程初始化状态与父进程一样 系统会为fork的进程分配新的资源   fork函数没有入参,会返回两次,分别返回子进程id和0,返回子进程id的是父进程,返回0的是子进程。     进程间同步之共享内存 在某种程度上,多进程是共同使用物理内存的 由于操作系统的进程管理,进程间的内存空间是独立的。并且进程默认是不能访问进程空间之外的内存空间的。 共享存储允许不相关的进程访问同一片物理内存 共享内存是两个进程之间共享和传递数据最快的方式 共享内存未提供同步机制(避免了并发问题),因此需要借助其他机制管理访问  

 

 使用共享内存的四个步骤

 

 

 

unix之域内套接字(socket) 域套接字是一种高级的进程间通信的方法 Unix域套接字可以用于同一机器进程间通信 Unix系统提供的域套接字提供了网络套接字类似的功能    举个例子:  

 

 

 server端创建,绑定,监听套接字,接受并处理消息,而client端创建,连接套接字并发送消息。

 

套接字提供了单机简单可靠的进程通信同步服务,但是缺点也很明显,只能在单机使用,不能跨机器使用。