首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ZMQ_CONFLATE==1不会阻止队列保存旧消息

ZMQ_CONFLATE==1不会阻止队列保存旧消息
EN

Stack Overflow用户
提问于 2020-06-10 03:54:20
回答 1查看 398关注 0票数 1

使用ZeroMQ和CPPZMQ4.3.2,我希望删除所有套接字的旧消息,包括

  • 成对
  • 酒吧/Sub
  • REQ/REP

因此,在绑定/连接之前,我在所有套接字上使用m_socks[channel].setsockopt(ZMQ_CONFLATE, 1)

测试

然而,当我进行下面的测试时,似乎旧的消息在每次重新连接时仍然会被刷新。在这次测试中,

  • 我使用一个线程将生成的sinewave发送到接收线程。
  • 每10秒我就把正弦波频率增加一倍
  • 然后10秒后我停止了这个过程

下面是发送者的伪代码

代码语言:javascript
运行
复制
// on sender end

auto thenSec = high_resolution_clock::now();
while(m_isRunning) {

    // generate sinewave, double the frequency every 10s or so

    auto nowSec = high_resolution_clock::now();
    if (duration_cast<seconds>(nowSec - thenSec).count() > 10) {
        m_sine.SetFreq(m_sine.GetFreq()*2);
        thenSec = nowSec;
    }
    m_sine.Generate(audio);

    // send to rendering thread

    m_messenger.send("inproc://sound-ear.pair", 
        (const void*)(audio), 
        audio_size, 
        zmq::send_flags::dontwait
    );

}

请注意,我已经使用DONTWAIT来减轻阻塞。

在接收端,我有一个zmq::poller_event处理程序,它只接收事件轮询上的最后一条消息。

在停止序列中,我将正弦波频率重置到它的最低值,比如440 the。

期望的

预期的行为将是:

  • 如果我在10s后停止发送者和接收者,当频率加倍时,
  • 我重新开始,
  • 然后我应该看到正弦波复位到440赫兹。

观察到的

但观察到的行为是,接收到的正弦波在重新启动通信后仍保持双倍频率,即880 of。

问题

我是不是做错了,还是应该用某种清除开关来强制删除所有的消息?

EN

回答 1

Stack Overflow用户

发布于 2020-06-10 07:25:21

好吧,我想我自己解决了。有点。

实际解

我终于意识到,我想要的行为是在停止呈现时刷新所有消息。根据官方医生(如何刷新ZeroMQ套接字队列中的所有消息),这只能通过以下方式实现:

  • 将发送方和接收方的ZMQ_LINGER选项的套接字设置为0,这意味着在关闭这些套接字时不保留任何内容;
  • 关闭发送端和接收端的套接字,这还涉及引导计票程序和对套接字的所有引用。

这似乎是很多不必要的工作,如果我要再次重新呈现我的数据,就在停止序列之后。但我找不到其他方法干净利落地解决这个问题。

初始努力

在我看来,ZMQ_CONFLATEPAIR并没有什么影响。我真的必须使用ZMQ_SNDHWMZMQ_RCVHWM来调整发送端和接收端的高水标记。

但是,我说“有点解决了”,因为调整HWM最终不是实时应用的最佳解决方案,

  • 将ZMQ_SNDHWM / ZMQ_RCVHWM设置为最小的"1",我们在实时方面仍然有相当大的延迟。
  • 此外,消费者线程也可能陷入运行不足的情境中,即HWM最低的可感知紧张状态。

如果我没有做错什么,我想最理想的解决方案仍然是我的目标场景的共享内存。这是可悲的,因为我非常喜欢ZMQ的多播消息传递模式的简单性,并且讨厌处理随处可见的线程锁定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62295562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档