Comments (6)
这不是特别的使用场景,是正常的路径,这应该是个bug
from cpp-ipc.
对的,因为异常退出,仅靠共享内存自身没办法知道是否有客户端挂了。而广播又依赖所有客户端全部接收完毕,做不到真正无锁。
目前暂时没有处理这种崩溃逻辑的完美方法。
如果有什么好的建议可以提给我,我会在后续尝试改进,谢谢!
from cpp-ipc.
我的使用场景比较简单,也就一个生成者一个消费者。我解决这个问题的临时解决方案,在recv() ,send()之前加锁。这个对于一个生成者一个消费者性能影响应该不大。所以感觉够用。
添加timeout
一般IO处理都会有timeout。我看到recv() ,send()里面的逻辑,有碰到进程异常退出时,会一直while yield sleep,能否引入timeout,来剔除挂掉的客户端或服务端,来打破阻塞,返回error code.。定时间隔的semaphore有锁检测代价低。
如何去除依赖
广播方式,导致服务端依赖所有客户端。我猜测这种设计方式应该是基于性能考虑吧? 能否有某种设计打破这种依赖关系,客户端或服务端挂了互不影响。比如每个消费者存在一个mq,生产者只负责统一更新所有的mq,生产者消费者互不影响? 又能做到无锁和高性能?
from cpp-ipc.
如果你的使用场景是单对单(spsc)的话,那就好办了。
你看ipc.h中的定义:
using route = chan<ipc::wr<relat::single, relat::multi, trans::broadcast>>;
using channel = chan<ipc::wr<relat::multi, relat::multi, trans::broadcast>>;
你只需要自定义一个这个:
using spsc_msg_queue = chan<ipc::wr<relat::single, relat::single, trans::unicast>>;
就可以满足你的需求,消息收发是无锁的。
默认的route和channel都是基于广播模式的;点对点的话,单播即可(点对点不可能广播)。
我确实计划近期再做一次重构,将timeout加进去。
之所以一开始没加这个,是因为我在公司里的使用场景不允许丢消息。
你说得很对,我不想让发送者轮询所有客户端去发消息。后面可能我会考虑试试轮询的方式性能是否可以满意。
目前的设计里,是不会忙等待的。while yield 4k次左右后,会调用wait,使用进程间的condition或semaphore进行等待。这样做是为了在消息不频繁的时候避免无谓的cpu消耗。
from cpp-ipc.
超时已添加。
from cpp-ipc.
我的使用场景比较简单,也就一个生成者一个消费者。我解决这个问题的临时解决方案,在recv() ,send()之前加锁。这个对于一个生成者一个消费者性能影响应该不大。所以感觉够用。
添加timeout
一般IO处理都会有timeout。我看到recv() ,send()里面的逻辑,有碰到进程异常退出时,会一直while yield sleep,能否引入timeout,来剔除挂掉的客户端或服务端,来打破阻塞,返回error code.。定时间隔的semaphore有锁检测代价低。如何去除依赖
广播方式,导致服务端依赖所有客户端。我猜测这种设计方式应该是基于性能考虑吧? 能否有某种设计打破这种依赖关系,客户端或服务端挂了互不影响。比如每个消费者存在一个mq,生产者只负责统一更新所有的mq,生产者消费者互不影响? 又能做到无锁和高性能?
我不太理解在recv()和send()之前加锁如何解决客户端异常退出问题,是否方便解释一下?
from cpp-ipc.
Related Issues (20)
- Communication between Windows 11 and WSL2 HOT 1
- 在同一个进程内使用cpp-ipc通信,server端退出会卡住 HOT 1
- find_package(cpp-ipc CONFIG REQUIRED)找不到 HOT 4
- 请问怎么编译demo下面的例子啊 HOT 2
- c++ 模板代码阅读 HOT 3
- libipc/semaphore.h may cause conflict while including thread HOT 2
- send函数无接收端也直接成功 HOT 4
- 请教关于使用方式和拷贝相关问题 HOT 2
- Bus error (core dumped) HOT 1
- 整体实现思路,文档 HOT 2
- 无法使用智能指针
- msg_que_t中无法使用智能指针
- single-multi broadcast 模式下,生产者-消费者同步问题 HOT 1
- sender和receiver的异常退出处理机制 HOT 15
- Lack of documentation HOT 3
- 请问为何不提供loan的接口 HOT 2
- send recv里面是忙等吗? HOT 3
- chan_wrapper::send()增加sendv()接口
- ipc::route supports single read and multiple write.? HOT 2
- 有时候进程会异常退出,导致pub端一直打印“fail: send, que->ready_sending() == false” HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cpp-ipc.