2010-11-09 41 views
0

当我想跟踪活动连接时,将它们保存到链接列表还是直接保存到某个索引将代表连接ID的数组中更好?我想,以防止可能的竞争状态的问题,例如:跟踪活动连接的数据结构

  • 号码列表中的连接大
  • 有人开始寻找这是在列表的末尾
  • 同时,在连接搜索,连接被分离

回答

0

该结构应该有一个连接句柄(SOCKET),一个引用计数和一个标志,表示应该关闭连接并尽快删除该对象。无论容器是什么,它都必须具有用于搜索/插入/删除的同步机制(关键部分)以及GetReference/Release逻辑。如果引发结束标志,GetReference函数应返回NULL。根据搜索条件,连接对象应该具有所有可以帮助它在容器中找到的值,您可能需要更多的GetReference。如果GetReference函数不存在于容器中,则其中一个GetReference函数可以创建新对象。

释放函数应关闭连接,并在引发结束标志并将引用计数降为零时从容器中删除该对象。然而版本一定不能关闭关键部分内的连接,因为这可能是耗时的操作(取决于graceful shutdown and lingering option)。释放应输入CS,减少引用计数,如果为零,则离开CS,关闭连接,再次输入CS,并从容器中移除对象并将其删除。因为关闭标志被提高,引用计数不会在两个CS之间上升。