.NET 4 自旋锁

2024-04-20

以下测试代码 (F#) 未返回我期望的结果:

let safeCount() =
  let n = 1000000
  let counter = ref 0
  let spinlock = ref <| SpinLock(false)
  let run i0 i1 () =
    for i=i0 to i1-1 do
      let locked = ref false
      try
        (!spinlock).Enter locked
        if !locked then
          counter := !counter + 1
      finally
        if !locked then
          (!spinlock).Exit()
  let thread = System.Threading.Thread(run 0 (n/2))
  thread.Start()
  run (n/2) n ()
  thread.Join()
  !counter

我期望的是SpinLock互斥计数器,因此它返回 1,000,000 的计数,但相反,它返回较小的值,就好像没有发生互斥一样。

任何想法有什么问题吗?


SpinLock 结构被复制的原因是!是一个函数:当作为参数传递给函数或从函数返回时(或任何其他类型的赋值),结构会被复制。但是,如果您访问contents直接引用单元格,不进行复制。

let safeCount() =
  let n = 1000000
  let counter = ref 0
  let spinlock = ref <| SpinLock(false)
  let run i0 i1 () =
    for i=i0 to i1-1 do
      let locked = ref false
      try
        spinlock.contents.Enter locked
        if !locked then
          counter := !counter + 1
      finally
        if !locked then
          spinlock.contents.Exit()
  let thread = System.Threading.Thread(run 0 (n/2))
  thread.Start()
  run (n/2) n ()
  thread.Join()
  !counter
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET 4 自旋锁 的相关文章

随机推荐

  • locationServicesEnabled 始终返回 YES

    我测试了我的设备 iPod Touch 2G iOS 4 1 是否启用了位置服务 permitted locationManager locationServicesEnabled 无论是否启用定位服务 我总是得到 是 我说的是位置服务的通
  • 当我在设备中运行应用程序时,dyld`gdb_image_notifier 异常

    当尝试在设备上加载我的应用程序时 有时我会遇到以下情况 例外 dyld gdb image notifier 0x2beca0cc bx lr 但停止并再次运行后一切正常 任何人都可以告诉我为什么会发生这种情况 基本上 调试器中似乎有一个断
  • Python 的 join() 不会连接我的对象的字符串表示形式 (__str__)

    我不确定我在这里做错了什么 gt gt gt class Stringy object def str self return taco def repr self return taco gt gt gt lunch Stringy gt
  • 带有可运行对象和结果的 FutureTask

    我用谷歌搜索了这个 但仍然无法得到充分的理解 我找不到任何使用的特定示例FutureTask Runnable runnable V result 构造函数 Java 文档说 未来提交 可运行任务 T结果 提交一个 Runnable 任务来
  • 如果最后一个地址是 0xFFFFFFFF,如何获取数组末尾之后的地址?

    如果将地址放在数组末尾是合法的 那么如果数组地址的最后一个元素是 我该怎么做0xFFFFFFFF 这段代码将如何工作 for vector
  • 将标准输出重定向到文件

    我正在尝试执行相当于 bash 命令的操作ls gt foo txt in C 下面的代码将输出重定向到变量 include
  • 使用 Perl 搜索并替换文件中的特定字符串[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Perl 中替换现有文件中的字符串 https stackoverflow com questions 6994947 how to replace a string in an existi
  • 使用变量访问 JSON 值

    我正在尝试使用 jQuery 访问 JSON 数据并根据变量获取一组特定的值 我在使用 之前已经这样做过 但由于某种原因我无法弄清楚这次出了什么问题 我的 JSON 文件 由 getJSON 读取 并命名为 jsonmaker php 如下
  • 使用 swagger 或任何其他工具生成 Rest API 文档

    我正在寻找一种方法来记录我的 Rest API 我的服务器是 Tomcat Spring 服务器 Rest API 是使用 Jenkins 实现的 Swagger 似乎是一个非常酷的解决方案 但我不知道如何在我的代码中使用它 我正在寻找创建
  • Ecto 和 Elixir 的默认日期时间

    我今天刚刚开始使用 Elixir 和 Phoenix 我正在尝试添加 Ecto 作为映射器 但我在使用时间时遇到了一些问题 这是我的模型 schema users do field name string field email strin
  • Python 字符串不是不可变的吗?那为什么a + " " + b 会起作用呢?

    我的理解是 Python 字符串是不可变的 我尝试了以下代码 a Dog b eats c treats print a b c Dog eats treats print a b c Dog eats treats print a Dog
  • 在现有数据表中添加按顺序编号的新列的最佳方法

    我有一个非空数据表 添加另一列 从 1 开始按顺序编号 的最佳方法是什么 我尝试了以下代码 但没有成功 DataColumn dc new DataColumn Col1 dc AutoIncrement true dc AutoIncre
  • DIV 高度设置为屏幕百分比?

    我希望将父 DIV 设置为 100 屏幕高度的 70 我已经设置了以下 CSS 但它似乎没有做任何事情 body font family Noto Sans sans serif margin 0 auto height 100 width
  • 重载运算符 == 与 Equals()

    我正在开发一个 C 项目 到目前为止 我已经使用不可变对象和工厂来确保类型的对象Foo总是可以比较是否相等 Foo对象一旦创建就无法更改 并且工厂始终为给定的参数集返回相同的对象 这非常有效 并且在整个代码库中我们假设 始终致力于检查相等性
  • postgresql - 将布尔列添加到表集默认值

    这是正确的 postgresql 语法 可以将列添加到表中 默认值为false ALTER TABLE users ADD priv user BIT ALTER priv user SET DEFAULT 0 Thanks ALTER T
  • 突变观察者可以监听“数据”属性的变化吗?

    所以问题是我有一个 html 元素 它在 data 属性中有一个对象 通过 jQuery ofc 设置 并且我想监听该属性的更改 我已经尝试了很多事情 比如在MutationObserverInit 对象 https developer m
  • 什么时候使用 git rm -f ?

    我正在学习 Git 无法理解在发出 git rm 命令时使用 f 标志的条件 请解释一下需要 rm f 而不是仅 rm 的情况 解释 The f如果文件与您上次签出的提交不是最新的 则用于删除该文件 这是为了防止您删除已进行更改但尚未签入的
  • Javascript,如何读取本地文件?

    我尝试从服务器读取本地文件 我已经 谷歌 这个话题有一段时间了 有些人说这是不可能的 有些人说这是可以做到的 在搜索过程中我发现了这个脚本 使用 xmlhttprequest 读取文件 如果您的 javascript 应用程序的 HTML
  • 如何在 jQuery keyup 事件中实现 debounce fn?

    计算基于用户输入 标准是使用keyup而不是change or blur 问题是代码在每次击键时都会触发 而我需要它在 500 毫秒超时后仅延迟并触发一次 我下面的例子显然不起作用 附加了小提琴 我找到了大卫 沃尔什的dbounce功能 但
  • .NET 4 自旋锁

    以下测试代码 F 未返回我期望的结果 let safeCount let n 1000000 let counter ref 0 let spinlock ref lt SpinLock false let run i0 i1 for i