交换的替代版本!还返回换出的值

2023-12-14

我在 IRC 上谈过这个问题#clojure今天的频道,但想在这里进行更详细的介绍。基本上,为了更好地理解原子,swap!, deref和 Clojure 并发作为一个整体,我想尝试编写一个函数,它不仅返回使用交换的值swap!,还有被换出的值。

(def foo (atom 42))

.
.
.

((fn [a]
  (do
    (println "swapped out: " @a)
    (println "swapped in: "(swap! a rand-int)))) foo)

可以打印:

swapped out:  42
swapped in:   14

但是如果另一个线程这样做swap!之间有相同的原子@a deref并致电swap!那么我可能会换出一个不是 42 的值。

如何编写一个函数来正确返回两个值(换出的值和换入的值)?

我不关心原子改变的各种值:我想知道的是换出的值是什么。

可以使用保证不会死锁的代码来编写此代码吗?如果可以,为什么?


Clojure 的swap!只是一个旋转的比较和设置。您可以定义一个替代版本来返回您喜欢的任何内容:

(defn alternate-swap [atom f & args]
  (loop []
    (let [old @atom
          new (apply f old args)]
      (if (compare-and-set! atom old new)
        [old new]  ; return value
        (recur)))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

交换的替代版本!还返回换出的值 的相关文章

  • pthread_self() 返回的线程 ID 与调用 gettid(2) 返回的内核线程 ID 不同

    这句话来自于pthread self 的手册页 http linux die net man 3 pthread self 那么 我应该根据什么来决定是否应该使用pthread self or gettid确定哪个线程正在运行该函数 两者都
  • Android 上的多处理

    我一直在 Android 上执行一些测试 以验证并行化算法 如 FFT 的性能可以提高多少 我通过使用带有 JNI FFTW 的 pthread 和 Java 线程 来自 JTransforms 来实现这些算法 我没有像预期那样通过使用线程
  • 如何让node.js中的线程休眠而不影响其他线程?

    As per 了解 Node js 事件循环 http blog mixu net 2011 02 01 understanding the node js event loop node js支持单线程模型 这意味着如果我向 Node j
  • 完成任务时手动捕获并应用 SynchronizationContext

    我遇到了挂起等待的问题 已描述here https stackoverflow com questions 40992035 awaiting a task that is being completed on a background t
  • Python GIL 防止多核机器中 CPU 使用率超过 100%?

    许多参考文献都说 Python GIL 降低了多核机器中多线程代码的性能 因为每个线程在执行之前都需要获取 GIL 换句话说 看起来GIL实际上是将多线程Python程序变成了单线程模式 例如 1 线程A获得GIL 执行一段时间 释放GIL
  • 我如何在环中模拟 json post 请求?

    我正在使用橄榄石 https github com xeqi peridot https github com xeqi peridot测试我的环应用程序 它工作正常 直到我尝试使用 json 数据模拟 post 请求 require ch
  • 让线程在窗体关闭时保持运行

    我在我的应用程序上创建了一个同步线程 我想知道如果我关闭申请表 是否有办法让该线程保持打开状态 直到完成同步过程 调用线程的WaitFor方法在您的 DPR 文件中 之后Application Run线 如果线程已经运行完毕 那么WaitF
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS
  • 将带有 **kwargs 错误的值线程化并传递给 TypeError

    我对 Python 还很陌生 并且正在通过这篇文章研究如何使用线程来处理某些代码 Python 使用线程或队列迭代调用函数的 for 循环 https stackoverflow com questions 12868956 python
  • 无论线程如何,对象是否总是能看到其最新的内部状态?

    假设我有一个带有简单整数计数变量的可运行对象 每次可运行对象运行时该变量都会递增 该对象的一个 实例被提交以在计划的执行程序服务中定期运行 class Counter implements Runnable private int coun
  • 依赖于不同队列上的另一个操作的 NSOperation 无法启动

    我有操作的依赖图 并且使用多个队列来组织各种操作流 例如 peopleQueue sitesQueue sessionQueue sessionQueue loginOp fetchUpdatedAccountOp peopleQueue
  • C++11 非阻塞生产者/消费者

    我有一个 C 11 应用程序 其中有一个生成数据的高优先级线程和一个消耗数据的低优先级线程 在我的例子中 将其写入磁盘 我想确保高优先级生产者线程永远不会被阻塞 即它仅使用无锁算法 使用无锁队列 我可以从生产者线程将数据推送到队列 并从消费
  • 异步调用的任务限制?

    我有一个同步工作的 NET 4 5 WCF 客户端 我正在更新它以使用新的异步 等待功能来进行多个同时服务器调用以同时获取数据块 在结束之前 我担心同时运行的所有线程将使服务器饱和 更不用说明年升级到该角色时会终止我的 Azure 辅助角色
  • 如何使用clojure中的map函数打印哈希映射列表的每个元素?

    我正在构建一个哈希映射列表 然后将其传递给另一个函数 当我尝试使用打印列表中的每个哈希映射时map它不工作 我可以打印完整列表或获取第一个元素等 defn m a println a map println a 以下仅适用于 repl m
  • 初始化 ConcurrentHashMap 值的最快方法

    ConcurrentHashMap 通常在并发环境中用于聚合某个键下的某些事件 例如计算某些字符串值的命中数 如果我们事先不知道密钥 我们需要有一个好的方法来根据需要初始化密钥 它应该在并发性方面快速且安全 这个问题的最佳模式 就效率而言
  • 线程池的 lambda 函数内的编译器错误变量“未捕获”

    我正在学习 C 中的多线程 并尝试设置线程池 但收到编译器错误 提示 错误 未捕获 mapperNodes 和 错误 未捕获 command 我读过一些关于使用 this 捕获 lambda 中的变量的内容 但到目前为止没有任何效果 如何在
  • 使用 volatile bool 强制另一个线程等待是否安全? (C++)

    我读到的有关 volatile 的所有内容都说它永远不安全 但我仍然倾向于尝试它 而且我还没有看到这种特定场景被宣布为不安全 我有一个单独的线程来渲染场景 从主模拟线程中提取数据 这没有同步 并且工作正常 问题是 当程序退出时 渲染器需要停
  • Clojure MySQL 语法错误异常(“[...] 靠近 '???????????????' [...]”)

    除了建立连接之外 我在使用 clojure contrib sql 做任何事情时都遇到困难 我有一个 mysqld 在 localhost 3306 上运行 数据库名为clj db 用户 clj user localhost 和密码 clj
  • 优化 Keras 以使用所有可用的 CPU 资源

    好吧 我真的不知道我在说什么 所以请耐心听我说 我正在使用 Theano 后端运行 Keras 以在 MNIST 图像上运行基本的神经网络 目前只是一个教程 过去 我一直使用我的旧 HP 笔记本电脑 因为我有 Windows 和 Ubunt
  • WPF 从主线程以外的其他线程截屏

    我有一个线程用于侦听 WPF 应用程序的命令 如果 WPF 应用程序收到截取屏幕截图的命令 则任务将移交给 screenshotService 我在互联网上的某个地方找到了一些代码来截取屏幕截图 似乎可以工作 但我还没有想清楚 我无法从另一

随机推荐

  • 在运行时更改 SetInterval 的间隔

    我编写了一个 JavaScript 函数 它使用 setInterval 每隔十分之一秒操作一个字符串 进行一定次数的迭代 function timer var section document getElementById txt val
  • 如何在Python 2中通过线程充分利用CPU核心

    下面的代码似乎是顺序执行的 而不是并发执行的 而且它只使用了一个CPU核心 有没有办法让它使用多个核心或在线程之间切换内容 我希望它能像java中的Thread类一样工作 import threading def work s for i
  • 如何在Java中检查2个日期是否在同一天

    我有 2 个日期变量 Date1 和 Date2 我想检查日期 1 是否与日期 2 属于同一日期 但允许它们有不同的时间 我该怎么做呢 这看起来是一件很容易做的事情 但我却很困难 编辑 我想避免外部库和东西 编辑 我最初的想法是删除小时 分
  • 运行 sonarrunner 时未找到类错误

    我收到类未找到错误 该类无法通过类加载器访问 并且从 gradle 运行 sonarrunner 时会提示错误 这些类作为依赖项包含在 gradle 的编译时 并且 gradle 构建工作正常 如何为声纳包含这些类 14 53 24 322
  • 如何处理多个xml标准? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在尝试将一组本地包装类写入我们的机构 API 我在一所高等教育机构工作 这些
  • Android 无法加载本地 libcrypto 未满足的链接错误

    我需要在我的应用程序中运行比操作系统中版本更新的 openssl 版本 我能够修补和 Android 源代码以编译较新的版本 然后提取共享库以在我的应用程序中使用 然后 我能够编译并链接我的本机代码 该代码仅需要较新版本的 openssl
  • 部署具有所有包依赖项的 Python Cloud Function

    我想部署一个不依赖于使用 requests txt 来安装软件包的云功能 我希望这些包可以在存储中使用 或者作为功能的一部分进行压缩和上传 这可能吗 编辑 2019 年 6 月 14 日 基本上我想用我的代码发送 numpy 和 panda
  • 使用 Node.js 在 html 表中显示 mysql

    我正在学习如何将node js 与mysql 一起使用 我试图找到一些好的文档 但徒劳无功 我现在可以在浏览器中显示 mysql 数据 但我想在某个时候通过我的 index html 和 css 文件来处理它 这是我的 app js mod
  • 如何在 iframe 的本地范围内执行注入的 javascript 代码?

    我在 iframe 中加载了一个 html 文档 我已经用 javascript 为该文档开发了一些弹出菜单代码 并将代码从主文档注入到 iframe 中 但我的代码在 iframe 中不起作用 因为它使用了 document 对象 令人惊
  • 如何覆盖 UISearchDisplayController searchResult TableView 中的“无结果”文本?

    我不想在我的服务器处理搜索查询时显示 无结果 文本 我找出了包含标签的表格单元格的确切坐标 并尝试覆盖它 self noResultsCoverView UIView alloc initWithFrame CGRectMake 0 0 4
  • DocumentFilter 的正则表达式可以匹配所有十进制数字,也可以匹配末尾只有一个小数的数字

    先问问题 我需要正则表达式来匹配111 or 111 or 111 111 只是任意数字 DocumentFilter 我需要用户能够输入111 with a decimal之后什么也没有 似乎无法正确处理 我发现所有正则表达式都匹配all
  • 正则表达式中间的前瞻不匹配

    我有一根绳子 s1 a b 我想匹配这个字符串但只捕获字母 我尝试使用前瞻 if s1 a z a z print Captured 1 2 n 但这似乎与我的字符串不匹配 我已经通过使用解决了原来的问题 相反 但我很好奇为什么我最初的尝试
  • 如何将在Python中创建/更新的Google工作表保存到特定文件夹?

    我有这个代码 from google colab import auth auth authenticate user import gspread from oauth2client client import GoogleCredent
  • 如果struct A嵌入到B中,A上的方法可以访问B的方法和字段吗?

    struct A func a A BName id int string return a Name struct B A Name string func main b B Name abc fmt Println b Name 代码失
  • 如何快速使用prepareForSegue?

    我有一个带有名为 BasicPhrasesVC 的表视图的 ViewController 我想传递所选单元格中的数据以将其显示在下一个 ViewController 称为 BasicPhrasesVC 上 class BasicPhrase
  • 如何将 n*1 矩阵转换为 n*n 对角矩阵

    我有一个 nx1 矩阵我想将其转换为 R 中的 nxn 对角矩阵 正如 Ben Bolker 所建议的 您可以简单地使用定义您的单位矩阵diag my matrix lt diag 0 25 4 my matrix 1 2 3 4 1 0
  • 如何使用多个隔离来服务请求

    如何设置 Dart 服务器以使用所有可用核心来处理即将到来的请求 例如 通过使用多个隔离来服务请求 Use the shared true的论证HttpServer bind 例子 import dart io import dart is
  • 切换大小写表达式

    考虑一个表达式 1 AB CD 1 这个表达式的解法是什么 上面的表达式是C语言中的一个switch表达式 2 AB CD gt 2 ABCD gt 之后我应该做什么 下面是代码片段 include
  • 在注释中使用属性值? [复制]

    这个问题在这里已经有答案了 我的一个项目中有这个带注释的课程 注释类是我定义的 问题 我可以代替字符串吗 TP REPORT 使用一些财产它的值在编译时不知道而只能在运行时知道 PhoenixTable tableName TP REPOR
  • 交换的替代版本!还返回换出的值

    我在 IRC 上谈过这个问题 clojure今天的频道 但想在这里进行更详细的介绍 基本上 为了更好地理解原子 swap deref和 Clojure 并发作为一个整体 我想尝试编写一个函数 它不仅返回使用交换的值swap 还有被换出的值