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

 

 

线程间同步之互斥量:

即线程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端创建,连接套接字并发送消息。

 

套接字提供了单机简单可靠的进程通信同步服务,但是缺点也很明显,只能在单机使用,不能跨机器使用。
posted @ 2022-05-16 21:55  wangao96  阅读(408)  评论(0编辑  收藏  举报