一、线程同步
1.全局变量
2.信号量:是一种资源,可以被申请、释放、初始化。释放:让资源数+1,不会阻塞。申请:让资源数-1,如果当前资源数为0,申请资源时会阻塞等待,直到资源不为0,才能继续向下执行。
Linux内核:PV操作,P申请、V释放。
步骤:①sem_t sem ②sem_init(&sem, 0, 1); 0为线程间共享,非0为进程间共享。最后一个参数为申请次数。 ③sem_wait(&sem);申请 ④sem_post(&sem);释放 ⑤sem_destroy(&sem);销毁
二、进程间通信的方式
1.管道:
①无名管道
只能用于具有亲缘关系的进程间通信
步骤:1.int pipefd[2]; 2.pipe(pipefd);
pipefd[0]为读 pipefd[1]为写
特点:1.如果有写端:①如果有数据,直接读取数据。②如果没有数据,阻塞等待直到读取到数据,再继续向下执行。
2.如果没有写端:①如果有数据,直接读取数据。 ②如果没有数据,不阻塞等待直接向下执行
3.如果有读端: ①如果管道中没有写满(64k),则直接写入。 ②如果管道中写满(64k),阻塞等待,直到有数据读出才能继续写入
4.如果没有读端:向管道中写入数据会产生管道破裂,导致进程异常退出。
②有名管道
1.创建管道:mkfifo(路径, 权限);
2.打开管道:open(路径, 方式);
3.读写数据
4.关闭管道
必须读写两端同时加入,才能继续向下执行。
2.信号
3.消息队列
4.共享内存
5.有名信号量
6.本地域套接字