您好我有以下问题:
我有一个多线程服务器,可以同时接收多个请求。 服务器管理会话列表。 当收到请求时,处理请求的线程必须识别会话是否已经为要求客户端打开(在会话列表中),或者在客户端还没有打开会话的情况下打开新会话。 到现在为止还挺好。我使用互斥锁保护会话列表,因此当请求进入时,列表被锁定,浏览直到找到相应的连接,然后解锁并返回指向会话的指针(按此顺序)。
现在我的问题: 考虑到可以为同一客户端接收多个请求(并且所有这些请求都必须得到处理),保护会话本身的最佳做法是什么(知道会话可能的操作是修改会话信息但是会话可以也会被请求删除)?
示例: 两个传入的请求。第一个请求锁定列表,查找会话,解锁列表并获取会话。 列表解锁后,第二个请求也是如此。 现在两者都有同一会话的句柄。
的问题: 的 如果其中一个请求意味着关闭会话怎么办?另一个请求现在具有该会话的句柄,但不知道它已被关闭(并被删除)。
你会提出什么解决方案?
请您事先获得任何帮助。
答案 0 :(得分:0)
您的问题是观察者模式的典型用例。
观察者是请求/客户。 主题是会话。当事件修改会话时,基于此会话的所有请求/客户端都会被通知会话中发生的事情。
因此,会话对象有一个请求/客户端列表。当某些内容修改会话状态时,将同步通知此列表的所有元素。通知时,您可以根据需要嵌入更多或更少的信息。
这种方法的典型陷阱是通知周期。会话通知修改会话等的请求