进程同步与进程互斥
来源:互联网 发布:网络联盟论坛 编辑:程序博客网 时间:2024/06/14 03:57
在多线程环境下,同步与互斥显得格外重要,如果处理不好,会导致运行结果出现意想不到的错误。
同步:先看下面这张图
线程p1,p2,p3合作完成一项任务,线程p2,p1可以并发进行,线程p3需要p1,p2都完成之后才能运行,这就是一个线程(或进程)同步问题。
临界资源:为多个线程所共享的资源,同一时间段只能容许一个线程对其进行操作的资源。
临界区:线程中,操作临界资源的程序段。
互斥:同一时间段内,只能容许一个线程进入临界区,对临界资源进行操作。
实现线程同步与线程互斥有软件方法和硬件方法,但是目前,软件方法很少使用,因此,这里我不涉及,主要讲解信号量机制(硬件方法)实现同步与互斥。
信号量S的含义:S>=0 代表当前可以使用的资源数量
S<0. 代表当前等待队列中线程数量
PV操作(不可被中断):
P(S):{ S=S-1; if(S<0){ 资源不足,将线程放入等待队列中 } }V(S):{ S=S+1; if(S>=0){ 从等待队列中取出一个线程执行 }}
P(S)代表申请一个资源,如果S>0则表示目前有可用资源,线程可以继续执行,否则,将其放入等待队列中。
V(S)代表释放一个资源,如果等待队列不为空,则从里取出一个线程,让其执行。
给大家讲两个例题来帮助大家理解。
就针对这幅图,用信号量实现三个线程的同步。代码如下:
//定义信号量并附初值semaphore S1=0 S2=0p1:{ ... p1代码段执行 V(S1)}p2:{ ... p2代码段执行 V(S2)}p3:{ P(S1) P(S2) p3代码段执行 ...}
不知道大家都没有弄懂,不懂的话,欢迎评论,我会定期查看的,和大家交流。
例题二:生产者-消费者问题(很经典的线程同步问题)
问题描述:生产者消费者问题是一种同步问题的抽象描述。计算机系统中的每个进程都可以消费(使用)或生产(释放)某类资源。这些资源可以是硬件资源,也可以是软件资源。
当某一进程使用某一资源时,可以看作是消费,称该进程为消费者。
而当某一进程释放某一资源时,它就相当于生产者。
通过一个有界缓冲区可以把一群生产者p1,p2…,pm,和一群消费者Q1,Q2,…,Qn联系起来。只要缓冲区未满,生产者就可以把产品送入缓冲区;只要缓冲区未空,消费者就可以从缓冲区中取走物品。如图:
解答代码如下:
//定义信号量semaphore mutex=1,S1=n,S2=0produce:{ P(S1) P(mutex) 执行放入消息代码 V(mutex) V(S2)}consumer:{ P(S2) P(mutex) 执行取出消息代码 V(mutex) V(S1)}
我来对上述变量进行解释一下,metux信号量是为了实现对共享缓冲区实现互斥,同一时间段内只能有一个线程对其进行修改。S1信号量表示空的缓冲区个数,S2表示非空缓冲区个数。
好吧,线程(或进程)的同步和互斥就讲到这里啦,其实就是要理解信号量机制就可以了。
- 进程同步与互斥
- 进程同步与互斥
- 进程同步与互斥
- 进程同步与互斥
- 进程同步与互斥
- 进程同步与互斥
- 进程互斥与进程同步
- 进程互斥与进程同步
- 进程同步与进程互斥
- 进程同步 & 互斥
- 进程的同步与互斥
- 进程的同步与互斥
- 操作系统 进程/线程 同步与互斥
- 进程的互斥与同步
- 进程互斥与同步的区别
- 同步与互斥(多线程/多进程)
- 进程同步与互斥基础
- 进程的同步与互斥_legend
- 关于宏##的使用注意一点
- 创建版本库
- 物体检测及分类方法总结(提供了很多论文和代码链接)
- MYSQL的Commit与程序的原子性
- clion_cmakelists收集
- 进程同步与进程互斥
- spring系列(四):切面编程(aop)2
- C#中WPF下自定义滚动条ScrollViewer样式
- error LNK2026
- spring框架下集成spring-session
- tslib1.4编译安装到ARM开发板
- 第三章 ALDS1_2_C:Stable Sort 稳定排序
- Android控件
- 选用Visual Studio Code替换Unity默认编辑器