问题标签 [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.
haskell - TChan 写入是否集成到 Haskell STM 中?
如果 STM 事务失败并重试,是否writeTChan
会重新执行调用以使您最终得到两次写入,或者 STM 是否仅在事务提交时才实际执行写入?即,这个解决睡觉理发师问题的方法是否有效,或者如果交易enterShop
第一次失败,客户可能会得到两次理发?
更新hairRequestChan
直到以上内容不一定是交易的一部分
之后我才注意到。我可以使用常规Chan
并在in块之后执行writeChan
inif
语句。但是做出这种改进会破坏提出这个问题的全部原因,所以我将保持原样。atomically
enterShop
stm - 写STM软件的时候还需要逻辑锁吗?
我没有写任何与STM(软件事务内存)相关的东西,只是阅读了网上的信息。所以这里只是一个虚构的例子
假设我们有一个 FIFO 缓冲区,其中包含最大允许项。因此,我们填充数组直到达到最大项目数,并在没有更多项目时移动它。使用传统方法,我不仅会锁定实际的移位和追加,还会锁定检查是否达到最大值的条件读取。我必须这样做,否则两个线程可以模拟地决定剩下的唯一项目是为他们准备的。所以我这里有一种与写冲突没有直接关系的逻辑锁。
使用 STM,我想两个线程都可以决定剩下的项目并尝试填充最后一个项目。但是正确性得以保留,因为在检测到另一个线程修改了相同的内存之后,在一个线程(或两个线程)中触发了回滚。乐观的情况是说某个时候一个线程最终会增加元素的数量,而另一个线程最终会转到另一个分支(FIFO 移位)。但是,如果双方都注意到最后一个项目被留下并试图填充它,我也看到了一个无限循环的可能性。
那么在写STM相关的软件时还需要加“逻辑”锁吗?
concurrency - Clojure STM:不一致的删除
考虑一个非常简单的哈希表,其结构如下:
我有它的基本操作,例如put
,get
和remove
。我编写了一些测试来使用pcalls
. 当我第一次开发一个在一个“ thread
”上运行的测试时,(即只使用一个函数来调用pcalls
)并且它成功了,我必须假设问题不存在,而是remove
函数不是线程安全的。
删除实现如下:
奇怪的是,甚至会发生只有一个元素的桶没有被删除。这很奇怪,因为只有向量的元素是 refs,而不是整个向量。 问题:为什么这段代码不是线程安全的,我可能做错了什么?
注意:我知道很多人会尝试评论这个应用程序的设计,但这不是我感兴趣的答案。我想了解 clojure 的 STM,而不是编写纯函数式代码。
haskell - STM 对某些 TVar 具有部分原子性
我正在使用 STM 做事,并且在使用TBQueue
数据结构方面取得了巨大成功。我一直在使用它的一个有用功能是根据 a 中的先决条件读取它TVar
,基本上像这样:
如果我们在执行这个块之前假设它queue
是空的并且shouldReadVar
包含True
,它将导致readTBQueue
调用,并且当包含或包含一个元素retry
时,该块将被重新执行,无论先发生什么。shouldReadVar
False
queue
我现在需要一个同步通道数据结构,类似于本文中描述的结构(如果你想理解这个问题,请阅读它),除了它需要像上一个例子那样带有前置条件,它是可读的,并可能与其他东西一起组成。
SyncChan
让我们称其为定义了操作writeSyncChan
的数据结构readSyncChan
。
这是一个可能的用例:这个(伪)代码(因为我混合了 STM/IO 概念而无法工作):
假设当前没有其他线程阻塞writeSyncChan
调用,并且shouldReadChan
contains True
,我希望块为“ ” ,retry
直到shouldReadChan
contains或不同的线程阻塞在. 换句话说:当一个线程打开而另一个线程阻塞到达 a时,或者反之亦然,我希望该值沿通道传输。在所有其他情况下,双方都应该处于一种状态,从而对 的变化做出反应,从而可以取消读取或写入。False
writeSyncChan
retry
writeSyncChan
readSyncChan
retry
shouldReadVar
T
上面链接的文章中描述的使用两个 ( )的天真的方法MVar
当然是不可能的。因为数据结构是同步的,所以不可能在两个atomically
块内使用它,因为您不能在原子上下文中更改一个TMVar
并等待另一个更改。TMVar
相反,我正在寻找一种部分原子性,在这种情况下,我可以“提交”事务的某个部分,并且只有在某些变量发生变化时才将其回滚,而其他变量则不能。如果我有像上面文章中的第一个示例一样的“msg”和“ack”变量,我希望能够写入“msg”变量,然后等待一个值到达“ack”,或者等待我的其他交易变量要改变。如果其他事务变量发生变化,则应重试整个原子块,并且如果“ack”值到达,则事务应像之前的状态一样继续。对于阅读方面,应该会发生类似的事情,除了我当然会从“msg”读取并写入“ack”。
这可以使用 GHC STM 来实现,还是我需要手动进行 MVar/回滚处理?
haskell - Haskell:使用镜头修改状态时,TChan 包装重复
考虑以下代码(和错误):
有人可以解释一下(TChan (TChan Broadcast))
是怎么回事吗?
clojure - 一个人可以监控 STM 的争用级别吗?
有什么方法可以查询 Clojure 的 STM 事务是否正在重试,以及以什么速率重试?
clojure - Clojure STM 模糊因子
在 Clojure 中,我们使用 STM 进行并发。
我的问题是 STM 使用数据的时间点值,这不是引入歧义吗?
我们怎么知道访问了什么值?
concurrency - 代理没有被执行
我有一系列功能(如some-operation
示例中的),我send
或send-off
代理:
当我开发我的应用程序时,这种方法对我很有效。但是在代码库中进行一些更改后,代理会在一段时间后停止运行(“一段时间”是几秒钟 - 几千次“递归”调用)。
他们的状态在域中是有效的,代理本身没有FAILED
,而且我确信他们没有在他们的dosync
块上活锁(可以衡量争用)。
我的怀疑是 JVM/OS 正在阻止底层执行程序线程运行,出于某种或其他原因。但我不知道如何检查这个假设是否正确。
一般来说,发送代理可能无法执行其挂起的“发送”的一些可能原因是什么?我可以检查/测量什么?
更新- 给定以下调试修改...
...代理仍然卡住,甚至不打印:failed
。
c# - STM.NET 与 Clojure STM
我想知道 Clojure 怎么可能已经实现了软件事务内存并且没有看到任何问题,而微软没有完成 C# 的工作并注意到一些问题使得实现此处描述的 STM 不切实际:http: //www.bluebytesoftware.com/blog/2010/01/03/ABriefRetrospectiveOnTransactionalMemory.aspx
请问有什么想法吗?
haskell - 这可以用STM完成吗?
免责声明:这可以很容易地使用MVar ()
一个简单的互斥锁来完成。我只是好奇,看看它是否可以用 STM 完成。
我想以原子方式执行以下操作:
读取一些变量。
根据我刚刚阅读的内容决定要执行的 I/O。
执行 I/O。
将结果记录在变量中。
具体而言,假设我想跟踪我已经读取了多少字节的输入,并假装在消耗了一定数量的字节后我已经达到了 EOF。(好吧,让两个线程同时从同一个文件中读取可能首先是一件虚假的事情,但请和我一起做......)
显然,这不可能是单一的 STM 交易;中间有 I/O。显然,将其视为两个不相关的交易也是错误的。(两个线程可以看到还剩下一个字节的配额,并且都决定读取那个字节。)
这个问题有很好的解决方案吗?或者 STM 只是完成这项任务的错误工具?