请问 socket_server.c 里 reserve_id 函数中 ATOM_CAS 失败后 --i retry 是作什么考虑?

70 views
Skip to first unread message

denger

unread,
Feb 23, 2018, 6:22:15 AM2/23/18
to skynet-users
if (ATOM_CAS(&s->type, SOCKET_TYPE_INVALID, SOCKET_TYPE_RESERVE)) {
 
...
} else {
 
// retry
 
--i
}

reserve_id 里相关数据应该只有 socket thread 会修改到才对

看到 https://groups.google.com/forum/#!topic/skynet-users/0SEtitv3DsA 里提到 monitor 线程出于模块内聚性等原因考虑数据使用原子操作修改。

如果这里出于同样原因考虑的话,说明有别的线程抢走了这个 slot 的 struct socket,导致原子操作失败。
既然已经被抢走了,这里为什么需要 --i 多 retry 一次啦?

云风 Cloud Wu

unread,
Feb 23, 2018, 9:26:39 PM2/23/18
to skynet...@googlegroups.com
reserve_id 在其它线程也会调用。例如 socket_server_listen socket_server_bind

denger <better...@gmail.com>于2018年2月23日周五 下午7:22写道:
--
您收到此邮件是因为您订阅了Google网上论坛上的“skynet-users”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到skynet-users...@googlegroups.com
要发帖到此群组,请发送电子邮件至skynet...@googlegroups.com
访问此群组:https://groups.google.com/group/skynet-users
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/skynet-users/6cbcf95d-fb5f-4f39-9588-1a8c5461ef67%40googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout
Reply all
Reply to author
Forward
0 new messages