Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency writeChan会覆盖或排队_Concurrency_Haskell - Fatal编程技术网

Concurrency writeChan会覆盖或排队

Concurrency writeChan会覆盖或排队,concurrency,haskell,Concurrency,Haskell,RWH手册中规定了以下内容: 如果Chan为空,readChan将阻塞,直到有一个值要读取。 writeChan函数从不阻塞:它将新值写入Chan 马上 我不清楚的是,调用writeChan是否会覆盖已存在的消息(假设某些消息尚未读取),或者它是否会按正确的顺序将消息排队,以便未读消息不会丢失?它会排队Chan是一个通道,消息可以在其中排队。相比之下,MVar可以只取一个值,作为变量而不是队列Chan是一个通道,消息可以在其中排队。相比之下,MVar可以只取一个值,表现为变量而不是队列。我不打算

RWH手册中规定了以下内容:

如果
Chan
为空,
readChan
将阻塞,直到有一个值要读取。
writeChan
函数从不阻塞:它将新值写入
Chan
马上


我不清楚的是,调用
writeChan
是否会覆盖已存在的消息(假设某些消息尚未读取),或者它是否会按正确的顺序将消息排队,以便未读消息不会丢失?

它会排队
Chan
是一个通道,消息可以在其中排队。相比之下,
MVar
可以只取一个值,作为变量而不是队列
Chan
是一个通道,消息可以在其中排队。相比之下,
MVar
可以只取一个值,表现为变量而不是队列。

我不打算将此作为答案发布,因为我不是100%确定这是正确的,但我的理解是,
Chan
基本上是一个队列,你将数据推到一边,然后从另一边出来。你可以很容易地测试这个。我建议大家看看Simon Marlow在Haskell的书中所写的并行和并发编程,我记得他介绍了
MVar
s和
Chan
s的实现,除此之外,你还可以看看这个实现,它只有几行代码,对于懒惰的人来说非常聪明:我不打算把它作为一个答案,因为我不是100%确定这是正确的,但我的理解是,
Chan
基本上是一个队列,你把数据推到一边,它从另一边出来。你可以很容易地测试这个。我建议你看看Simon Marlow在Haskell的书中所写的并行和并发编程,我记得他在书中介绍了
MVar
s和
Chan
s的实现,以及其他一些东西。你也可以看看这个实现,它只有几行,对于懒惰的人来说非常聪明: