当我想跟踪活动连接时,最好将它们保存到链表中还是直接保存到某个数组中,其中index将表示连接的ID?我想防止可能的竞争条件问题,例如:
答案 0 :(得分:0)
结构应具有连接句柄(SOCKET),引用计数和表示应该关闭连接并尽快删除对象的标志。无论容器是什么,它必须具有用于搜索/插入/移除的同步机制(关键部分)和GetReference / Release逻辑。如果引发关闭标志,则GetReference函数应返回NULL。您可能需要更多的GetReference,具体取决于搜索条件(连接对象应该具有可以帮助它在容器中找到的所有值)。如果容器中不存在GetReference函数之一,则可以创建新对象。
释放函数应该关闭连接,如果引发关闭标志并且引用计数降为零,则从容器中删除对象。但是,发布不得关闭关键部分内的连接,因为这可能是耗时的操作(取决于graceful shutdown and lingering option)。释放应进入CS,减少引用计数,如果为零则离开CS,关闭连接,再次进入CS,并从容器中删除对象并删除它。因为关闭标志被提升,所以两个CS之间的引用计数不会升高。