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

顾小白xx 2021-01-12 09:18:00
我有两个程序A和B 共享数据的时候我用的是内存共享,A 有12个线程不断的写,每写一次就要 通知B一次然后B根据A写的内容作出不同的操作。数据共享到时没有问题。但是怎么在A写完的时候立即通知B作出反应呢,因为这个对实时性要求比较高,我试过用消息的方式但是消息还是有点慢。
...全文
453 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存

15,473

社区成员

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

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