【发布时间】:2015-06-13 22:08:53
【问题描述】:
我正在尝试在 Haskell 轻量级线程之间进行通信。线程希望相互发送消息以进行通信和同步。
我最初为此使用 TMVar,但我刚刚意识到语义是错误的:TMVar 将在内部存储一条消息,因此将消息定位到空的 TMVar 不会堵塞。仅当您将消息发布到 full TMVar 时,它才会被阻止。
谁能推荐一个类似的STM IPC 结构:
- 将导致所有写入阻塞,直到消息被消耗;
- 在提供消息之前会导致所有读取被阻塞?
即零长度管道是理想的;但我不认为BoundedChan 的容量为 0 会很高兴。(另外,它不是 STM。)
【问题讨论】:
-
你的外部问题是什么?你为什么要这个?
-
您是否愿意考虑一种解决方案,使发送成为
IO操作而不是STM操作(但接收仍然是STM操作)?反之亦然(发送是STM操作,但接收是IO操作)? -
我需要能够组合操作(以便能够一次读取其中的几个内容,并在第一件事变得可读时立即解除阻塞)。 AFAIK 这只能通过
STM来完成。 -
@Daniel Wagner:事实上,是的。见下文。
标签: multithreading haskell stm