我正在尝试实现一个基于 UDP 的服务器,它维护两个套接字,一个用于控制(ctrl_sock),另一个用于数据传输(data_sock)。问题是,ctrl_sock始终是上行链路和data_sock下行链路。也就是说,客户端将通过 请求数据传输/停止ctrl_sock,数据将通过 发送给他们data_sock。
现在的问题是,由于模型是无连接的,服务器将不得不维护一个注册客户信息列表(我称之为peers_context),以便它可以“盲目地”向他们推送数据,直到他们要求停止。ctrl_sock在这种盲传过程中,客户端可以通过异步的方式向服务器发送控制消息。这些信息,除了初始请求和停止之外,还可以是例如文件部分的首选项。因此,peers_context必须异步更新。但是,通过 的传输data_sock依赖于这种结构,因此会产生和peers_context之间的同步问题。我的问题是,我能做些什么来安全地维护这两个袜子和结构,以便异步更新ctrl_sockdata_sockpeers_contextpeers_context不会造成破坏。顺便说一句,更新peers_context不会很频繁,这就是为什么我需要避免请求-回复模型。
data_sock我对实现的初步考虑是,在主线程(监听线程)中维护 ctrl_sock,在另一个线程(工作线程)中维护传输。但是,我发现在这种情况下很难同步。例如,如果我在 中使用互斥锁peers_context,每当工作线程锁定peers_context时,监听线程在需要修改时将无法再访问它peers_context,因为工作线程无休止地工作。另一方面,如果侦听器线程持有peers_context并写入它,则工作线程将无法读取peers_context并终止。有人可以给我一些建议吗?
顺便说一下,实现是在Linux环境中用C语言完成的。只有监听线程需要peers_context偶尔修改,工作线程只需要读取。衷心感谢!