进程及线程间通信方式总结

进程间通信方式

传递数据的方式

1.pipe

必须是有亲缘关系的进程之间使用,平时用"ls | grep abc"等命令时用得就是这个,这个"|"我猜测是用了两种系统调用实现,一个是pipe(popen),一个是dup2,没有看过bash或sh的源码,只是猜测。

2.fifo

会在文件系统中产生一个管道文件。

3.socket

有一个unix域套接字,可用作进程间通信,但有说法posix消息队列的性能优于systemv消息队列,systemv消息队列性能优于unix域套接字。

4.posix 消息队列

写程序该选到systemv消息队列的时候,大部分可以用posix消息队列代替,因为他的性能更好。

5.systemv 消息队列

gcc下不用链接库就可以使用,posix的线程和消息队列分别需要链接pthread库和rt库

6.systemv 共享内存

传递数据方式更灵活。

同步方式

1.信号

2.systemv 信号量

不同于pthread信号量,它需要一个key,以在不同进程间标识每个信号量资源。

线程间通信方式

传递数据的可用方式

1.全局变量

2.堆内存

3.任何进程间可用的传递数据方式

同步方式

1.pthread 互斥锁

有自旋锁、读写锁、互斥锁三种类型

2.pthread 条件变量

与互斥锁一块可完成一个生产者与消费者的模型

3.pthread 信号量

可单独实现一个生产者和消费者的模型

4.任何进程间可用的同步方式

1、参考资料:精通Linux C编程 (虽然名子很山寨,但觉得这本书写得很全,作为资料查阅感觉许多时候,比APUE都强。网上也有人说这本书有很多错误,至少目前还没有见过一个我确定是错误的地方)

2、关于一个全局的int变量读写是不是需要加锁的问题。见过很多帖子讨论这个问题,但没有见过一个能信服的答案。自己用起来在一些比较简单的情况下x没有加锁,比如只有两个线程共用一个变量,一个线程只读,另一个线程只写。有人说,容易引起core dump,但至少我还没有见过这种情况。

3、写得不是很专业,很多地方没有经过特别多的求证,仅供参考。

时间: 2024-10-05 04:07:21

进程及线程间通信方式总结的相关文章

Linux的进程/线程间通信方式总结

Linux系统中的进程间通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程通信方式:包括信号量(Semaphore), 消息队列(Message Queue), 和共享内存(Shared Memory) 网络主机间的进程通信方式 * RPC: Remote Procedure Call 远程过程调用 * Socket: 当前最流行的网络通信方式, 基于TCP/IP协议的通

进程与线程间的通信方式

一.进程间的通信方式 # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. # 有名管道 (namedpipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信. # 信号量(semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手

进程间,线程间通信方式

一.进程间的通信方式 1 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系.2 有名管道 (namedpipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信.3 信号量(semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手段.

c++ 线程间通信方式

一:两个进程间的两个线程通信,相当于进程间通信 二:一个进程中的两个线程间通信 通信方式: 1.互斥锁 mutex; lock_guard (在构造函数里加锁,在析构函数里解锁) unique_lock 自动加锁.解锁 2.读写锁 shared_lock 3.信号量 c++11中未实现,可以自己使用mutex和conditon_variable 实现 代码实现如下: #pragma once#include <mutex>#include <condition_variable>c

线程间通信方式

一,线程通信简介 一般而言,在一个应用程序中(即同一个进程),一个线程往往不是孤立存在的,常常需要和其它线程通信,以执行特定的任务.如主线程和次线程,次线程和次线程之前,工作线程和用户界面线程等,这样的话,线程之间必定有一个信息传递的渠道.这种线程间的通信不但难以避免,而且在多线程的编程中,也是复杂和繁琐的.线程间的通信涉及到4个问题: 线程间如何通信 线程之间如何同步,使一个线程的活动不会破话另一个线程的活动,以保证计算结果的正确合理 当线程间具有依赖关系时,如何调度多个线程的处理顺序 如何避

进程与线程之间的区别及联系

一.定义: 1.进程:进程是一个具有独立功能的程序关于某个数据集合的以此运行活动.是系统进行资源分配和调度的独立单位,也是基本的执行单元.是一个动态的概念,是一个活动的实体.它不只是程序的代码,还包括当前的活动. 进程结构特征:由程序.数据和进程控制块三部分组成.具有独立性.并发性.异步性和动态性的特点. (1).进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)--存储处理器执行的代码,数据区域(data regio

线程间通信原理

从操作系统的角度讲,线程间通信比进程间通信要容易的多,因为线程之间可以共享进程的内存空间.因此,他们可以共享位于进程全局数据区和栈和堆上的所有内容. 唯一只属于某个线程的就是线程的栈-------它可以存放只属于线程的对象. 下面逐一解读线程间通信方式: 1.   共享进程的变量 这是最基本的通信方式,但要注意不要共享线程栈上的变量,因为它随时可能被某个线程销毁,而另一个线程就无法访问它了. 所以Java编译器不允许使用栈上的变量来共享. 例子1: 如下面这个编译器是会报错的, protecte

[操作系统] 进程与线程

一.进程 进程的引入多个程序在执行时,需要共享系统资源,从而导致各程序在执行过程中出现相互制约的关系,程序的执行表现出间断性的特征. 这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的执行情况,即我们无法从程序的字面上看出它何时执行,何时停顿,也无法看出它与其它执行程序的关系,因此,程序这个静态概念已不能如实反映程序并发执行过程的特征.为了深刻描述程序动态执行过程的性质,人们引入"进程(Process)"概念.

Linux进程与线程的区别

cnyinlinux 本文较长,耐心阅读,必有收获! 进程与线程的区别,早已经成为了经典问题.自线程概念诞生起,关于这个问题的讨论就没有停止过.无论是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.一般程序员而言,搞清楚二者的概念,在工作实际中去运用成为了焦点.而资深工程师则在考虑系统层面如何实现两种技术及其各自的性能和实现代价.以至于到今天,Linux内核还在持续更新完善(关于进程和线程的实现模块也是内核完善的任务之一). 本文将以一个从事Linux平台系统开发的程序员角