gpt4 book ai didi

c++ - handle_info() 无法同时执行多个调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:47 27 4
gpt4 key购买 nike

我有一个程序(C++ 应用程序),其中多个线程正在调用写在 erlang 模块(genserver)中的“handle_info()”。

据观察,如果线程 1 向这个“handle_info()”发送了一堆消息(比如 1000),同时如果线程 2 也同时向“handle_info() 发送了 1 或 2 条消息( )",观察到,handle_info()只有在完成Thread-1发送的消息时才会执行Thread-2发送的消息。

我读过 handle_info() 是异步的,但在这种情况下,我发现它的工作方式类似于同步方法。

我做错了什么吗?

注意:

  1. Thread-1 和 Thread-2 由同一个 erlang 模块生成,线程函数来自 C++ 应用程序。

  2. 线程函数使用“enif_send()”函数 (erl_nif.h) 调用 handle_info()。

最佳答案

it is observed that, handle_info() executes messages sent by Thread-2 only when it finishes the messages sent by Thread-1.

在我看来,Thread-1 在 Thread-2 发送任何消息之前发送了所有消息。 gen_server OTP 行为不使用选择性接收来处理消息,即该实现不搜索服务器的邮箱以尝试将接收模式与消息匹配。相反,gen_server 按顺序处理服务器邮箱中的每条消息,即按照消息到达邮箱的顺序。

该设计的目的是防止内存泄漏。当未处理的邮件堆积在邮箱中时,就会发生此类泄漏。 gen_server:call/cast 发送到达服务器邮箱的消息(或者退出信号被转换为消息并放入服务器邮箱,或者套接字导致消息放入服务器的邮箱,或者有人使用 ! 直接向服务器发送消息),服务器按照消息到达的顺序处理邮箱中的消息。对于每条消息,服务器调用适当的回调函数:

Mod:handle_call()
Mod:handle_cast()
Mod:handle_info()

根据邮件的格式并从邮箱中删除邮件。

关于c++ - handle_info() 无法同时执行多个调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54534197/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com