首先,一些背景。我想要一个队列,我想以两种不同模式之一操作。在第一种模式下,如果队列中存在一个元素,我希望能够检索一个元素,但如果没有元素,则不阻塞。在第二种模式下,我希望能够阻塞直到队列有一个元素。(我知道我可以为每种模式使用专门的机制,但我想排除一些通用代码,因此如果我可以对两种操作模式使用相同的机制,那将是最简单的。)
我可以使用Chan
,但根据文档,我不应该使用isEmptyChan
它,因为由于可能出现死锁,它已被弃用。这给我留下了TChan
. 该tryReadTChan
函数为我提供了我想要的第一种模式(即我可以检查元素是否存在而不阻塞),但我不确定究竟是什么readTChan
。我的心智模型是,该atomically
块将不断重试,直到通道中出现一个元素,这意味着它会忙于循环浪费 CPU 周期;这与readChan
(即非 STM 版本)不同,后者(如果我理解正确的话)实际上会阻塞线程的执行,直到元素可用,因为运行时线程调度程序可以理解 MVar。
TChan
就像这样,Chan
如果我使用readTChan
运行时足够聪明,不会在值可用之前调度调用线程?还是会浪费大量 CPU 周期不断轮询一个值到达?