目录

一、管道文件

1、有名管道

2、无名管道

二、信号量

三、共享内存

四、消息队列

五、多线程通信

(1)、线程并发

(2)、线程同步:

1、信号量

2、互斥锁

3、条件变量(提供一种线程间通知的机制)

4、读写锁

5、fork

六、套接字文件


一、管道文件

半双工(单方向的)

写入管道的数据在内存中

1、有名管道

通过mkfifo创建管道文件,可以在任意两个进程间使用

写入数据

读取数据

测试用例:

2、无名管道

只能在父子进程间使用(注意父子进程需要关两次)

测试用例:这里fd[0]fd[1] 为什么分别是3,4呢?

标准输入,标准输出,标准错误输出占前三个

二、信号量

临界资源:只允许一个进程访问的资源

临界区:访问临界资源的代码段

信号量:特殊的变量,值>=0;

P操作:获取资源,信号量减一

V操作:释放资源,信号量加一

sem.h  sem.c

a.c

b.c

测试用例:注意这里两个程序同时执行

编译的时候,也要加上sem.c

三、共享内存

sem1.h sem1.c

写:

读:

测试用例:

四、消息队列

通过ipcs -q查看相关信息

往消息队列里写数据

读数据

测试用例: (注意,这里每写入一次,消息数量加一次,读一次,减少一次)

五、多线程通信

(1)、线程并发

并行:两个线程同时运行

并发:两个线程交替运行

进程是操作系统资源分配的基本单位

线程是系统调度的基本单位

进程:一个正在运行的程序

线程:进程内部的一条执行路径(序列)

1、用户级线程

优点:创建开销小,缺点:无法使用多个处理器

2、内核级线程

优点:创建开销大,缺点:可以使用多个处理器(并行)

3、组合级线程

pthread_create();//创建一个线程

形参分别为(线程id,线程属性,子线程名,标记位)

pthread_exit();//退出一个线程(注意:不是进程)

参数为:一个变量(注意,一般为全局变量,不能为局部变量,因为受生存期影响) 可以为NULL

pthread_join();//等待一个线程结束或合并线程

参数为(线程id,退出线程的返回值)

测试用例:

注意:如果不等待线程执行完毕的话,可能会造成主程序直接退出了,线程不一定会被执行

测试用例:

 

思考:这里为什么是这样的顺序呢?而不是我们想象中的01234

因为我们在第15行传入的参数是i的地址,但是i的值一直在改变,所以这里是随机值

如果我们传入的参数是i本身的话,打印出来就会是01234了,但是顺序不一定一样

因为我们知道,线程是并发执行的,所以并没有执行先后顺序,可以理解为同时执行、

(2)、线程同步:

1、信号量

用信号量实现ABC交替打印

测试用例:

2、互斥锁

测试用例:

3、条件变量(提供一种线程间通知的机制)

测试用例:

线程安全:初识

注意:在多线程环境中,要保证同步且安全(可重入函数)

如果这里是strtok的话,在两个线程中strtok内部的静态指针可能被覆盖,会导致打印结果和预期的不一样

测试用例:

4、读写锁

测试用例:

5、fork

进程fork

 这里明显看到,父进程被fork了

线程fork

六、套接字文件

多进程(Linux)相关推荐

  1. linux 面包店 多进程,Linux下的多进程编程(一)

    什么是一个进程?进程这个概念是针对系统而不是针对用户的,对用户来说,他面对的概念是程序.当用户敲入命令执行一个程序的时候,对系统而言,它将启动一个进程.但和程序不同的是,在这个进程中,系统可能需要再启 ...

  2. linux下创建多进程,linux之多进程fork:进程创建

    linux下实现多线程有两种函数调用:一种是通过pthread.h里面已经封装好的函数调用,另一种是通过unistd.h里面的fork函数调用.前面已经已经列举了pthread的使用,下面来书fork ...

  3. linux dhclient源码 多进程,Linux日志中出现大量dhclient mesage浅析

    最近检查发现一台Linux服务器,发现其日志里面有大量下面信息,其中部分信息做了脱敏处理.其中一个地址A(192.168.AAA.AAA) 为DNS服务器地址,地址B(192.168.BBB.BBB) ...

  4. linux dhclient源码 多进程,Linux日志中出现大量dhclient mesage浅析,

    Linux日志中出现大量dhclient mesage浅析, 最近检查发现一台Linux服务器,发现其日志里面有大量下面信息,其中部分信息做了脱敏处理.其中一个地址A(192.168.AAA.AAA) ...

  5. linux 生产者消费者 多进程,Linux多线程,生产者消费者算法和条件变量的使用

    接着上一篇博文,原来双线程,现在为了实现 暂停/继续 功能,又加了一个线程.第三线程使用条件信号量,当用户按下S键,第三线程将检测到,并且将ifpause置为1,然后输出线程将在if语句成立后被条件信 ...

  6. linux消息队列非亲缘,linux进程

    linux进程Tag内容描述: 1.linux消息队列进程通信 一.消息队列的基本概念消息队列(也叫做报文队列)是Unix系统V版本中3种进程间通信机制之一.另外两种是信号灯和共享内存.这些IPC机制 ...

  7. python和c混合编程 gil_终于搞明白python与gil

    感想:东看一篇文章西看一篇文章,终于把gil的概念理顺了 我们都知道,比方我有一个4核的CPU,那么这样一来,在单位时间内每个核只能跑一个线程,然后时间片轮转切换.但是Python不一样,它不管你有几 ...

  8. 利用selenium 爬取豆瓣 武林外传数据并且完成 数据可视化 情绪分析

    全文的步骤可以大概分为几步: 一:数据获取,利用selenium+多进程(linux上selenium 多进程可能会有问题)+kafka写数据(linux首选必选耦合)windows直接采用的是写my ...

  9. 资讯类网站增量式爬虫

    一:网站增量式爬虫流程图 1)前提是A.B.C网站分类下历史数据已经爬取过 2)A.B.C网站下的同一网站下分类数据存储的表名有规律 二:代码实现 1)init初始化方法中添加基本的请求伪装信息 2) ...

  10. 【秋招】计算机视觉面试题

    计算机视觉相关: 1.如果提高深层神经网络的特征表示能力? ①增加隐藏层个数 ②pooling操作 ③使用非线性激活 如何防止过拟合? ①使用L1 L2正则化 ②Dropout ③使用早停(现在基本不 ...

最新文章

  1. sql 差值_使用Blink CEP实现差值聚合计算
  2. 软件加密与授权管理的概念
  3. 【深度学习】卷积神经网络(CNN)详解
  4. linux的基础知识——捕捉SIGCHLD、信号传参,中断系统调用
  5. mysql中触发器中分隔符_php – 在触发器中使用分隔符的Mysql错误
  6. luogu1984 烧水问题 (找规律)
  7. Ubuntu Java环境配置
  8. 阿里云oss完成简单上传
  9. django之视图view小知识
  10. 算法设计与分析: 2-13 标准二维表问题
  11. 英语打卡3:可数名词
  12. [NowCoder5673E]Enigmatic Partition
  13. index+match函数/一对多查找匹配,可以代替Vlookup函数的使用。
  14. 如何优化在搜索引擎上的友好度
  15. 51 汇编语言编程--输入密码
  16. Detr的数据流,详细的维度信息
  17. 中国太空传感器市场现状研究分析与发展前景预测报告(2022)
  18. Vue+Cesium创建项目并加载地图全过程
  19. 团体的证件类型三证合一
  20. grub for dos 入门

热门文章

  1. web安全之--UrlRewrite
  2. linux提权参考方法
  3. 中国到欧洲专线快递要多长时间
  4. 网络技术领域专业术语解释大全-170个术语
  5. java 队列 抢购_使用Redis实现抢购的一种思路(list队列实现)
  6. 从源码分析SortedMap与NavigableMap
  7. 怎么在Mysql中添加列_mysql如何给表中添加列(字段)?
  8. 营销组合--4P理论vs4CS
  9. vgg19.npy下载
  10. 格局决定结局,九种职场高效思维你都有吗