【发布时间】:2020-01-06 06:18:05
【问题描述】:
我正在使用以下序列实现简单的 tcp 服务器:
{ok, LS} = gen_tcp:listen(Port,[{active, true}, {reuseaddr, true}, {mode, list}]),
{ok, Socket} = gen_tcp:accept(LS),
Pid = spawn_link(M, F, [Socket]),
gen_tcp:controlling_process(Socket, Pid)
使用选项 {active, true} 可能会导致竞争条件,即新数据包在调用“controlling_process”之前到达套接字进程,这将导致 {tcp,Socket,Data} 消息到达父进程而不是孩子。
如何避免这种情况?
【问题讨论】:
-
看起来不会存在竞争条件,因为在调用
controlling_process之前没有任何内容从套接字读取任何内容。所以,你问题中的可能这个词让我很困扰。你真的见过比赛条件发生吗?如果是这样,您能否提供更多详细信息? -
{active, true} 标志意味着(如果我理解正确的话)系统主动从套接字读取数据包并将它们作为 {tcp,Socket,Data} 发送到控制进程消息收件箱。
-
我明白你的意思。我建议将呼叫从您生成的进程(在您的示例中为
M:F)移至gen_tcp:accept以避免这种情况。这样您就可以完全避免致电gen_tcp:controlling_process。 -
@Keynslug 在我还在打字的时候在下面发布了一个很好的答案。
标签: erlang