网络编程中的一般时序问题

时间:2009-07-07 03:03:10

标签: network-programming

假设聊天服务器中有两种类型的数据包。这两个数据包用于获取另一个用户的状态。一个(称为 REQ-STAT RES-STAT )是请求和响应形式,另一个( NOT-STAT )是通知表格包。

例如,如果我将 [REQ-STAT simpson] 发送到服务器,我可能会 [RES-STAT simpson online] 。或者,如果用户SIMPSON的状态已更改,我将获得用户的状态,如 [NOT-STAT simpson offline]

好的,当然,服务器在多核机器上运行并使用多个线程。

如果服务器获得 [REQ-STAT simpson] 数据包,服务器将准备数据包 [RES-STAT simpson online] - 如果SIMPSON在线。此时,SIMPSON已注销,因此服务器将数据包 [NOT-STAT simpson offline] 发送到客户端。服务器发送 [NOT-STAT simpson offline] 数据包后, [RES-STAT simpson online] 数据包被发送

// the server lock during using user data structure but not for the whole process.

------[REQ-STAT simpson]------> simpson is online and prepare response packet

<--[NOT-STAT simpson offline]-- simpson has been logged out and send not packet

<--[RES-STAT simpson online]--- send response

// the latest packet does not have the latest information !!!

如果 LOCK 不用于整个过程,是否会出现上述情况?如果是这样,我应该锁定所有吗?还有其他解决方案吗?

感谢。

1 个答案:

答案 0 :(得分:1)

看来您可以通过接收程序处理不同数据包的方式来解决它。

如果程序询问SIMPSON是否在线,则需要回答是或否。但它应该视为:SIMPSON曾经或者不是在线我发送请求的时间,但他可能在创建此数据包后1毫秒退出,所以我不能保证他在线现在,我只知道他是在我问的时候。使用此信息可以获得它的价值。

但是,当程序收到“SIMPSON已签名”数据包时,您知道SIMPSON在数据包中指定的时间注销。收到此信息将覆盖任何待处理的当前状态请求,因为您刚被告知他已签字。因此,“中止”当前状态请求(如果有)。通过中止,我的意思是优雅地停止该线程或忽略该请求的结果。

另一种选择是将高分辨率时间戳(必须是线程安全的)或线程安全的,特定于客户端的顺序计数器嵌入到每个数据包中,以便客户端可以计算出与订单无关的事件顺序收到他们。标准的线程安全编程实践将允许您执行此操作,听起来您对此有所了解。