问题标签 [stm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
541 浏览

haskell - TChan 写入是否集成到 Haskell STM 中?

如果 STM 事务失败并重试,是否writeTChan会重新执行调用以使您最终得到两次写入,或者 STM 是否仅在事务提交时才实际执行写入?即,这个解决睡觉理发师问题的方法是否有效,或者如果交易enterShop第一次失败,客户可能会得到两次理发?

更新hairRequestChan直到以上内容不一定是交易的一部分 之后我才注意到。我可以使用常规Chan并在in块之后执行writeChaninif语句。但是做出这种改进会破坏提出这个问题的全部原因,所以我将保持原样。atomicallyenterShop

0 投票
1 回答
105 浏览

stm - 写STM软件的时候还需要逻辑锁吗?

我没有写任何与STM(软件事务内存)相关的东西,只是阅读了网上的信息。所以这里只是一个虚构的例子

假设我们有一个 FIFO 缓冲区,其中包含最大允许项。因此,我们填充数组直到达到最大项目数,并在没有更多项目时移动它。使用传统方法,我不仅会锁定实际的移位和追加,还会锁定检查是否达到最大值的条件读取。我必须这样做,否则两个线程可以模拟地决定剩下的唯一项目是为他们准备的。所以我这里有一种与写冲突没有直接关系的逻辑锁。

使用 STM,我想两个线程都可以决定剩下的项目并尝试填充最后一个项目。但是正确性得以保留,因为在检测到另一个线程修改了相同的内存之后,在一个线程(或两个线程)中触发了回滚。乐观的情况是说某个时候一个线程最终会增加元素的数量,而另一个线程最终会转到另一个分支(FIFO 移位)。但是,如果双方都注意到最后一个项目被留下并试图填充它,我也看到了一个无限循环的可能性。

那么在写STM相关的软件时还需要加“逻辑”锁吗?

0 投票
1 回答
89 浏览

concurrency - Clojure STM:不一致的删除

考虑一个非常简单的哈希表,其结构如下:

我有它的基本操作,例如put,getremove。我编写了一些测试来使用pcalls. 当我第一次开发一个在一个“ thread”上运行的测试时,(即只使用一个函数来调用pcalls)并且它成功了,我必须假设问题不存在,而是remove函数不是线程安全的。

删除实现如下:

奇怪的是,甚至会发生只有一个元素的桶没有被删除。这很奇怪,因为只有向量的元素是 refs,而不是整个向量。 问题:为什么这段代码不是线程安全的,我可能做错了什么?


注意:我知道很多人会尝试评论这个应用程序的设计,但这不是我感兴趣的答案。我想了解 clojure 的 STM,而不是编写纯函数式代码。

0 投票
1 回答
192 浏览

haskell - STM 对某些 TVar 具有部分原子性

我正在使用 STM 做事,并且在使用TBQueue数据结构方面取得了巨大成功。我一直在使用它的一个有用功能是根据 a 中的先决条件读取它TVar,基本上像这样:

如果我们在执行这个块之前假设它queue是空的并且shouldReadVar包含True,它将导致readTBQueue调用,并且当包含或包含一个元素retry时,该块将被重新执行,无论先发生什么。shouldReadVarFalsequeue


我现在需要一个同步通道数据结构,类似于本文中描述的结构(如果你想理解这个问题,请阅读它),除了它需要像上一个例子那样带有前置条件,它是可读的,并可能与其他东西一起组成。

SyncChan让我们称其为定义了操作writeSyncChan的数据结构readSyncChan

这是一个可能的用例:这个(伪)代码(因为我混合了 STM/IO 概念而无法工作):

假设当前没有其他线程阻塞writeSyncChan调用,并且shouldReadChancontains True,我希望块为“ ” ,retry直到shouldReadChancontains不同的线程阻塞在. 换句话说:当一个线程打开而另一个线程阻塞到达 a时,或者反之亦然,我希望该值沿通道传输。在所有其他情况下,双方都应该处于一种状态,从而对 的变化做出反应,从而可以取消读取或写入。FalsewriteSyncChanretrywriteSyncChanreadSyncChanretryshouldReadVar

T上面链接的文章中描述的使用两个 ( )的天真的方法MVar当然是不可能的。因为数据结构是同步的,所以不可能在两个atomically块内使用它,因为您不能在原子上下文中更改一个TMVar并等待另一个更改。TMVar

相反,我正在寻找一种部分原子性,在这种情况下,我可以“提交”事务的某个部分,并且只有在某些变量发生变化时才将其回滚,而其他变量则不能。如果我有像上面文章中的第一个示例一样的“msg”和“ack”变量,我希望能够写入“msg”变量,然后等待一个值到达“ack”,或者等待我的其他交易变量要改变。如果其他事务变量发生变化,则应重试整个原子块,并且如果“ack”值到达,则事务应像之前的状态一样继续。对于阅读方面,应该会发生类似的事情,除了我当然会从“msg”读取并写入“ack”。

这可以使用 GHC STM 来实现,还是我需要手动进行 MVar/回滚处理?

0 投票
1 回答
255 浏览

haskell - Haskell:使用镜头修改状态时,TChan 包装重复

考虑以下代码(和错误):

有人可以解释一下(TChan (TChan Broadcast))是怎么回事吗?

0 投票
3 回答
254 浏览

clojure - 一个人可以监控 STM 的争用级别吗?

有什么方法可以查询 Clojure 的 STM 事务是否正在重试,以及以什么速率重试?

0 投票
2 回答
365 浏览

clojure - Clojure STM 模糊因子

在 Clojure 中,我们使用 STM 进行并发。

我的问题是 STM 使用数据的时间点值,这不是引入歧义吗?

我们怎么知道访问了什么值?

0 投票
2 回答
129 浏览

concurrency - 代理没有被执行

我有一系列功能(如some-operation示例中的),我sendsend-off代理:

当我开发我的应用程序时,这种方法对我很有效。但是在代码库中进行一些更改后,代理会在一段时间后停止运行(“一段时间”是几秒钟 - 几千次“递归”调用)。

他们的状态在域中是有效的,代理本身没有FAILED,而且我确信他们没有在他们的dosync块上活锁(可以衡量争用)。

我的怀疑是 JVM/OS 正在阻止底层执行程序线程运行,出于某种或其他原因。但我不知道如何检查这个假设是否正确。

一般来说,发送代理可能无法执行其挂起的“发送”的一些可能原因是什么?我可以检查/测量什么?

更新- 给定以下调试修改...

...代理仍然卡住,甚至不打印:failed

0 投票
2 回答
1100 浏览

c# - STM.NET 与 Clojure STM

我想知道 Clojure 怎么可能已经实现了软件事务内存并且没有看到任何问题,而微软没有完成 C# 的工作并注意到一些问题使得实现此处描述的 STM 不切实际:http: //www.bluebytesoftware.com/blog/2010/01/03/ABriefRetrospectiveOnTransactionalMemory.aspx

请问有什么想法吗?

0 投票
3 回答
705 浏览

haskell - 这可以用STM完成吗?

免责声明:这可以很容易地使用MVar ()一个简单的互斥锁来完成。我只是好奇,看看它是否可以用 STM 完成。

我想以原子方式执行以下操作:

  • 读取一些变量。

  • 根据我刚刚阅读的内容决定要执行的 I/O。

  • 执行 I/O。

  • 将结果记录在变量中。

具体而言,假设我想跟踪我已经读取了多少字节的输入,并假装在消耗了一定数量的字节后我已经达到了 EOF。(好吧,让两个线程同时从同一个文件中读取可能首先是一件虚假的事情,但请和我一起做......)

显然,这不可能是单一的 STM 交易;中间有 I/O。显然,将其视为两个不相关的交易也是错误的。(两个线程可以看到还剩下一个字节的配额,并且都决定读取那个字节。)

这个问题有很好的解决方案吗?或者 STM 只是完成这项任务的错误工具?