当我想跟踪活动连接时,最好将它们保存到链表中还是直接保存到索引将代表连接 ID 的某个数组中?我想防止可能的竞争条件问题,例如:
- 列表中的连接数很大
- 有人开始搜索列表末尾的连接
- 同时,在搜索过程中,连接断开
当我想跟踪活动连接时,最好将它们保存到链表中还是直接保存到索引将代表连接 ID 的某个数组中?我想防止可能的竞争条件问题,例如:
该结构应该有一个连接句柄 (SOCKET)、一个引用计数和一个标志,表示应该关闭连接并尽快删除对象。无论容器是什么,它都必须具有用于搜索/插入/删除和 GetReference/Release 逻辑的同步机制(关键部分)。如果引发关闭标志,则 GetReference 函数应返回 NULL。您可能需要多个 GetReference,具体取决于搜索条件(并且连接对象应该具有所有可以帮助在容器中找到它的值)。如果容器中不存在新对象,则 GetReference 函数之一可以创建新对象。
如果关闭标志被引发并且引用计数下降到零,则释放函数应该关闭连接并从容器中删除对象。但是 Release不能在临界区关闭连接,因为这可能是耗时的操作(取决于正常关闭和延迟选项)。释放应该进入CS,减少引用计数,如果为零则离开CS,关闭连接,再次进入CS,并从容器中移除对象并删除它。因为关闭标志被提高,所以两个 CS 之间的引用计数不会提高。