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