两个进程间怎么做到 共享数据和同步

顾小白xx 2021-01-12 09:18:00
我有两个程序A和B 共享数据的时候我用的是内存共享,A 有12个线程不断的写,每写一次就要 通知B一次然后B根据A写的内容作出不同的操作。数据共享到时没有问题。但是怎么在A写完的时候立即通知B作出反应呢,因为这个对实时性要求比较高,我试过用消息的方式但是消息还是有点慢。
...全文
422 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluesen 2021-01-18
  • 打赏
  • 举报
回复
引用 11 楼 顾小白xx 的回复:
[quote=引用 10 楼 bluesen 的回复:][quote=引用 9 楼 顾小白xx 的回复:]其实我知道消息可以,只是A 和B两个进程通信的话我使用的wm_copydata这个消息,那么然后用sendmessage发送,它处理会有一段时间,可能会影响A的执行效率。

PostMessage就不会堵塞了[/quote]但是postmessage要排队啊,可能不会立即处理[/quote]
会不会立即处理取决于B,和A有啥关系?
B很忙,你A等死也没用啊,这个思路一定要清楚。
顾小白xx 2021-01-18
  • 打赏
  • 举报
回复
引用 10 楼 bluesen 的回复:
[quote=引用 9 楼 顾小白xx 的回复:]其实我知道消息可以,只是A 和B两个进程通信的话我使用的wm_copydata这个消息,那么然后用sendmessage发送,它处理会有一段时间,可能会影响A的执行效率。
PostMessage就不会堵塞了[/quote]但是postmessage要排队啊,可能不会立即处理
bluesen 2021-01-18
  • 打赏
  • 举报
回复
引用 9 楼 顾小白xx 的回复:
其实我知道消息可以,只是A 和B两个进程通信的话我使用的wm_copydata这个消息,那么然后用sendmessage发送,它处理会有一段时间,可能会影响A的执行效率。

PostMessage就不会堵塞了
顾小白xx 2021-01-18
  • 打赏
  • 举报
回复
其实我知道消息可以,只是A 和B两个进程通信的话我使用的wm_copydata这个消息,那么然后用sendmessage发送,它处理会有一段时间,可能会影响A的执行效率。
bluesen 2021-01-18
  • 打赏
  • 举报
回复
引用 13 楼 顾小白xx 的回复:
[quote=引用 12 楼 bluesen 的回复:][quote=引用 11 楼 顾小白xx 的回复:][quote=引用 10 楼 bluesen 的回复:][quote=引用 9 楼 顾小白xx 的回复:]其实我知道消息可以,只是A 和B两个进程通信的话我使用的wm_copydata这个消息,那么然后用sendmessage发送,它处理会有一段时间,可能会影响A的执行效率。

PostMessage就不会堵塞了[/quote]但是postmessage要排队啊,可能不会立即处理[/quote]
会不会立即处理取决于B,和A有啥关系?
B很忙,你A等死也没用啊,这个思路一定要清楚。[/quote]

引用 10 楼 bluesen 的回复:
[quote=引用 9 楼 顾小白xx 的回复:]其实我知道消息可以,只是A 和B两个进程通信的话我使用的wm_copydata这个消息,那么然后用sendmessage发送,它处理会有一段时间,可能会影响A的执行效率。

PostMessage就不会堵塞了[/quote]如果用事件的方式进行线程间的同步,A 有12个线程要监听每个线程是不是要创建12个事件,然后根据每个线程来确定那个线程有信号或者无信号呢?[/quote]

有这问的功夫,你自己写个程序都测试完了。
顾小白xx 2021-01-18
  • 打赏
  • 举报
回复
引用 12 楼 bluesen 的回复:
[quote=引用 11 楼 顾小白xx 的回复:][quote=引用 10 楼 bluesen 的回复:][quote=引用 9 楼 顾小白xx 的回复:]其实我知道消息可以,只是A 和B两个进程通信的话我使用的wm_copydata这个消息,那么然后用sendmessage发送,它处理会有一段时间,可能会影响A的执行效率。
PostMessage就不会堵塞了[/quote]但是postmessage要排队啊,可能不会立即处理[/quote] 会不会立即处理取决于B,和A有啥关系? B很忙,你A等死也没用啊,这个思路一定要清楚。[/quote]
引用 10 楼 bluesen 的回复:
[quote=引用 9 楼 顾小白xx 的回复:]其实我知道消息可以,只是A 和B两个进程通信的话我使用的wm_copydata这个消息,那么然后用sendmessage发送,它处理会有一段时间,可能会影响A的执行效率。
PostMessage就不会堵塞了[/quote]如果用事件的方式进行线程间的同步,A 有12个线程要监听每个线程是不是要创建12个事件,然后根据每个线程来确定那个线程有信号或者无信号呢?
an_bachelor 2021-01-16
  • 打赏
  • 举报
回复
1秒对软件来说时间也很长了,所以你的瓶颈肯定不是消息传递花了太多时间,1s已经够传递几十万、至少是几万次消息。 你应该想办法优化掉你的B线程轮询时没轮到花费的时间。
顾小白xx 2021-01-15
  • 打赏
  • 举报
回复
引用 6 楼 陈仲甫 的回复:
[quote=引用 5 楼 顾小白xx 的回复:][quote=引用 4 楼 陈仲甫 的回复:]多数情况下 可以用socket 127.0.0.1作为通信地址 每秒能轻松传个几百MB,大型块能传更快 你的实时性问题可以查查是不是自己程序的问题 例如算法不合理 高开销的轮询等等 当然如果确实是游戏什么的应用,每秒拷一大堆图形可能是不够
不是游戏,其实A程序的工作只是发送一个开关的命令顺便带上开关的通道号,剩下的都是B程序的工作,因为开的时间有限,所以要及时响应。我现在是想用内存共享把开关和通道的序号和一些其他的信息带上,然后写到一个文件,然后通知B开始读,B读到之后就开启一个线程一直循环检测,当然不能一直开着,如果A发了一个关的命令B要区分是哪个通道的关然后停止检测,等待下一次开启这样一直反复操作。每次检测完的数据 做一下分析之后输出。目前就这么多[/quote] 听起来并不是需要很高传输带宽的场景,但是每个操作周期太短这样吗? 建议你先写个测试程序,也别传递参数,就一个线程里面看速度够不够。这样才能找出瓶颈是不是消息传输(其实windows消息是很快的)。 还有听着你的设计是A发消息让B去开始和停止轮询,可以考虑这个轮询是否能够化为事件等待/通知模式?因为轮询你挨个查,X硬件无数据可用的时候,Y硬件可能正在有数据,那么这个时间就浪费了,但是必须你硬件有什么方式支持通知,或是把轮询放到你硬件去实现,通常软件还是会慢很多,隔着多个数量级的化那怎么优化软件也没用。[/quote] A的每次开始到结束基本上也就10秒左右。在这期间要取到数据因为液体大概1秒左右到达检测位置,所以要尽快通知B程序开启检测
an_bachelor 2021-01-14
  • 打赏
  • 举报
回复
引用 5 楼 顾小白xx 的回复:
[quote=引用 4 楼 陈仲甫 的回复:]多数情况下 可以用socket 127.0.0.1作为通信地址 每秒能轻松传个几百MB,大型块能传更快 你的实时性问题可以查查是不是自己程序的问题 例如算法不合理 高开销的轮询等等 当然如果确实是游戏什么的应用,每秒拷一大堆图形可能是不够
不是游戏,其实A程序的工作只是发送一个开关的命令顺便带上开关的通道号,剩下的都是B程序的工作,因为开的时间有限,所以要及时响应。我现在是想用内存共享把开关和通道的序号和一些其他的信息带上,然后写到一个文件,然后通知B开始读,B读到之后就开启一个线程一直循环检测,当然不能一直开着,如果A发了一个关的命令B要区分是哪个通道的关然后停止检测,等待下一次开启这样一直反复操作。每次检测完的数据 做一下分析之后输出。目前就这么多[/quote] 听起来并不是需要很高传输带宽的场景,但是每个操作周期太短这样吗? 建议你先写个测试程序,也别传递参数,就一个线程里面看速度够不够。这样才能找出瓶颈是不是消息传输(其实windows消息是很快的)。 还有听着你的设计是A发消息让B去开始和停止轮询,可以考虑这个轮询是否能够化为事件等待/通知模式?因为轮询你挨个查,X硬件无数据可用的时候,Y硬件可能正在有数据,那么这个时间就浪费了,但是必须你硬件有什么方式支持通知,或是把轮询放到你硬件去实现,通常软件还是会慢很多,隔着多个数量级的化那怎么优化软件也没用。
顾小白xx 2021-01-14
  • 打赏
  • 举报
回复
引用 4 楼 陈仲甫 的回复:
多数情况下 可以用socket 127.0.0.1作为通信地址 每秒能轻松传个几百MB,大型块能传更快 你的实时性问题可以查查是不是自己程序的问题 例如算法不合理 高开销的轮询等等 当然如果确实是游戏什么的应用,每秒拷一大堆图形可能是不够
不是游戏,其实A程序的工作只是发送一个开关的命令顺便带上开关的通道号,剩下的都是B程序的工作,因为开的时间有限,所以要及时响应。我现在是想用内存共享把开关和通道的序号和一些其他的信息带上,然后写到一个文件,然后通知B开始读,B读到之后就开启一个线程一直循环检测,当然不能一直开着,如果A发了一个关的命令B要区分是哪个通道的关然后停止检测,等待下一次开启这样一直反复操作。每次检测完的数据 做一下分析之后输出。目前就这么多
an_bachelor 2021-01-14
  • 打赏
  • 举报
回复
多数情况下 可以用socket 127.0.0.1作为通信地址 每秒能轻松传个几百MB,大型块能传更快 你的实时性问题可以查查是不是自己程序的问题 例如算法不合理 高开销的轮询等等 当然如果确实是游戏什么的应用,每秒拷一大堆图形可能是不够
tiger波波 2021-01-14
  • 打赏
  • 举报
回复
互斥对象:互斥对象和临界区很像,采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程同时访问。当前拥有互斥对象的线程处理完任务后必须将线程交出,以便其他线程访问该资源。 总结下互斥量Mutex: 1)互斥量是内核对象,它与关键段都有“线程所有权”所以不能用于线程的同步。 2)互斥量能够用于多个进程之间线程互斥问题,并且能完美的解决某进程意外终止所造成的“遗弃”问题。
顾小白xx 2021-01-12
  • 打赏
  • 举报
回复
内存共享怎么做到同步呢?
sichuanwww 2021-01-12
  • 打赏
  • 举报
回复
1.管道:速度慢,容量有限,只有父子进程能通讯 2.FIFO:任何进程间都能通讯,但速度慢 3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 4.信号量:不能传递复杂消息,只能用来同步 5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
Linux系统提供了各种系统调用API用于进程的通信:    无名管道PIPE    命名管道FIFO    消息队列    共享内存    信号量    文件锁    信号signal....其中还包括system V和POSIX 两种接口标准,除此之外,Linux系统自身还扩展了自己的一套API接口用于进程通信,比如signalfd、timerfd、eventfd等。本视频教程为《Linux系统编程》第05期,本期课程将会带领大家学习Linux下将近15种进程通信IPC工具的使用,了解它们的通信机制、编程实例、使用场景、内核中的实现以及各自的优缺点。本课程会提供PDF版本的PPT课件和代码,学员购买课程后可到课程主页自行下载嵌入式自学路线指导图:------------------------------------------------------------------------------------------------------                   《嵌入式工程师自我修养》嵌入式自学系列教程                                          作者:王利涛------------------------------------------------------------------------------------------------------一线嵌入式工程师精心打造,嵌入式学习路线六步走: 第 1 步:Linux三剑客零基础玩转Linux+UbuntuGit零基础实战:Linux开发技能标配vim从入门到精通基础篇:零基础学习vim基本命令vim从入门到精通定制篇:使用插件打造嵌入式开发IDEmakefile工程实践基础篇:从零开始一步一步写项目的Makefilemakefile工程实践第2季:使用Autotools自动生成Makefile软件调试基础理论printf打印技巧Linux内核日志与打印使用QEMU搭建u-boot+Linux+NFS嵌入式开发环境第 2 步:C语言嵌入式Linux高级编程第1期:C语言进阶学习路线指南第2期:计算机架构与ARM汇编程序设计第3期:程序的编译、链接和运行原理第4期:堆栈内存管理第6期:数据存储与指针第7期:嵌入式数据结构与Linux内核的OOP思想第8期:C语言的模块化编程第9期:CPU和操作系统入门      搞内核驱动开发、光会C语言是不行的!      你还需要学习的有很多,包括:计算机体系架构、ARM汇编、程序的编译链接运行原理、CPU和操作系统原理、堆栈内存管理、指针、linux内核中的面向对象思想、嵌入式系统架构、C语言的模块化编程.....第 3 步:Linux系统编程第00期:Linux系统编程入门第01期:揭开文件系统的神秘面纱第02期:文件I/O编程实战第03期:I/O缓存与内存映射第04期:打通进程与终端的任督二脉第05期:进程通信-------------------we are here!‍    第 4 步:Linux内核编程‍    练乾坤大挪移,会不会九阳神功,是一道坎。搞驱动内核开发,懂不懂内核也是一道坎。第 5 步:嵌入式驱动开发    芯片原理、datasheet、硬件电路、调试手段、总线协议、内核机制、框架流程....第 6 步:项目实战    嵌入式、嵌入式人工智能、物联网、智能家居...

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧