首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >handle_info()不能同时执行多个调用

问handle_info()不能同时执行多个调用
EN

Stack Overflow用户
提问于 2019-02-05 12:12:32
回答 1查看 104关注 0票数 2

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

注意到,如果线程-1向此" handle_info()“发送一串消息(例如1000),同时如果线程-2也同时向"handle_info()”发送1或2条消息,则可以观察到,handle_info()只在线程-2完成由Thread-1发送的消息时执行由线程-2发送的消息。

我读过handle_info()是异步的,但在本例中,我发现它像同步方法一样工作。

我做错什么了吗?

注意:

  1. 线程-1和线程-2是由同一个erlang模块生成的,线程函数来自C++应用程序。
  2. 线程函数使用"enif_send()“函数(erl_nif.h)调用enif_send()。
EN

回答 1

Stack Overflow用户

发布于 2019-02-06 19:30:14

可以看到,handle_info()只在完成Thread-1发送的消息时才执行Thread-2发送的消息。

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

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

代码语言:javascript
复制
Mod:handle_call()
Mod:handle_cast()
Mod:handle_info()

取决于邮件的格式,并从邮箱中删除邮件。

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

https://stackoverflow.com/questions/54534197

复制
相关文章

相似问题

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