Giter VIP home page Giter VIP logo

Comments (6)

Kairo-Dai avatar Kairo-Dai commented on September 28, 2024

这不是特别的使用场景,是正常的路径,这应该是个bug

from cpp-ipc.

mutouyun avatar mutouyun commented on September 28, 2024

对的,因为异常退出,仅靠共享内存自身没办法知道是否有客户端挂了。而广播又依赖所有客户端全部接收完毕,做不到真正无锁。

目前暂时没有处理这种崩溃逻辑的完美方法。
如果有什么好的建议可以提给我,我会在后续尝试改进,谢谢!

from cpp-ipc.

liuping1997 avatar liuping1997 commented on September 28, 2024

我的使用场景比较简单,也就一个生成者一个消费者。我解决这个问题的临时解决方案,在recv() ,send()之前加锁。这个对于一个生成者一个消费者性能影响应该不大。所以感觉够用。

添加timeout
一般IO处理都会有timeout。我看到recv() ,send()里面的逻辑,有碰到进程异常退出时,会一直while yield sleep,能否引入timeout,来剔除挂掉的客户端或服务端,来打破阻塞,返回error code.。定时间隔的semaphore有锁检测代价低。

如何去除依赖
广播方式,导致服务端依赖所有客户端。我猜测这种设计方式应该是基于性能考虑吧? 能否有某种设计打破这种依赖关系,客户端或服务端挂了互不影响。比如每个消费者存在一个mq,生产者只负责统一更新所有的mq,生产者消费者互不影响? 又能做到无锁和高性能?

from cpp-ipc.

mutouyun avatar mutouyun commented on September 28, 2024

如果你的使用场景是单对单(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.

mutouyun avatar mutouyun commented on September 28, 2024

超时已添加。

from cpp-ipc.

pi1ot avatar pi1ot commented on September 28, 2024

我的使用场景比较简单,也就一个生成者一个消费者。我解决这个问题的临时解决方案,在recv() ,send()之前加锁。这个对于一个生成者一个消费者性能影响应该不大。所以感觉够用。

添加timeout
一般IO处理都会有timeout。我看到recv() ,send()里面的逻辑,有碰到进程异常退出时,会一直while yield sleep,能否引入timeout,来剔除挂掉的客户端或服务端,来打破阻塞,返回error code.。定时间隔的semaphore有锁检测代价低。

如何去除依赖
广播方式,导致服务端依赖所有客户端。我猜测这种设计方式应该是基于性能考虑吧? 能否有某种设计打破这种依赖关系,客户端或服务端挂了互不影响。比如每个消费者存在一个mq,生产者只负责统一更新所有的mq,生产者消费者互不影响? 又能做到无锁和高性能?

我不太理解在recv()和send()之前加锁如何解决客户端异常退出问题,是否方便解释一下?

from cpp-ipc.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.