OCaml:主线程等待服务器第n次连接完成通知的实现问题
OCaml服务器连接计数与线程同步问题
需求
- 服务器接收客户端连接并处理,当第n次连接关闭后,服务器自行关闭或停止处理新连接
- 启动服务器的线程必须等待服务器发送的事件通知后,才能继续执行后续逻辑
预期行为
期望代码结构如下:
let t = Thread.create (Unix.establish_server loop) addr in f1 (); wait_for_loop_signal (); f2 ();
尝试的方案及问题
方案1:Thread.join
尝试用线程等待join来实现:
let t = Thread.create (Unix.establish_server loop) addr in f1 (); Thread.join t; f2 ();
无效原因:Unix.establish_server会为每个客户端连接创建独立子线程执行loop,loop所在的子线程无法访问启动establish_server的线程,无法通过终止父线程来触发Thread.join。
方案2:Event通道
尝试通过Event通道让loop向主线程发送通知:
let channel = Event.new_channel () in let t = Thread.create (Unix.establish_server (loop channel)) addr in f1 (); let _ = Event.sync (Event.receive channel) in f2 ();
问题:主线程会在Event.sync (Event.receive channel)处持续阻塞,尽管loop中已正确执行send操作,但消息始终未被接收读取,原因未知。
内容的提问来源于stack exchange,提问作者hra1234
相关产品推荐
相关产品推荐

