我有一个 TChan 作为线程的输入,它的行为应该是这样的:
如果 sombody 在特定时间内写入 TChan,则应检索内容。如果在指定时间内没有写入任何内容,则应解除阻塞并继续Nothing
。
我对此的尝试是使用这样的超时功能System.Timeout
:
timeout 1000000 $ atomically $ readTChan pktChannel
这似乎有效,但现在我发现,我有时会丢失数据包(它们被写入通道,但在另一侧没有读取。在日志中我得到这个:
2014.063.11.53.43.588365 Pushing Recorded Packet: 2 1439
2014.063.11.53.43.592319 Run into timeout
2014.063.11.53.44.593396 Run into timeout
2014.063.11.53.44.593553 Pushing Recorded Packet: 3 1439
2014.063.11.53.44.597177 Sending Recorded Packet: 3 1439
其中“Pushing Recorded Packet”是来自一个线程的写入,“Sending Recorded Packet”是从发送者线程中的 TChan 读取。缺少带有 的行Sending Recorded Packet 2 1439
,这表明从 TChan 读取成功。
似乎如果在错误的时间点收到超时,通道就会丢失数据包。我怀疑threadKill
里面使用的功能timeout
和STM一起玩不好。
这个对吗?有人有另一种不会丢失数据包的解决方案吗?