问题标签 [spinwait]

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 回答
731 浏览

c# - 试图用 SpinWait.SpinUntil() 替换 lock() 但它不起作用

让我们从代码开始;

checkedUnlock是一个HashSet<ulong>

_hashsetLock是一个对象

对比

fun在一个整数

我的理解是,SpinWait在这种情况下应该像 一样工作,lock()但是添加了更多的项目HashSet,有时它匹配锁,有时其中还有 1 到 5 个项目,这很明显它不起作用

我的理解有缺陷吗?

编辑

我试过了,它似乎有效,我的测试显示与目前相同的lock()数字

那么为什么它会与这个一起工作但不是 SpinWait.SpinUntil()呢?

编辑#2

小全应用看

在这段代码中,SpinWait.SpinUntil有时会爆炸(添加会抛出异常)但是当它工作时,计数会不同,所以我对此的预期行为是错误的

0 投票
1 回答
403 浏览

c++ - 旋转等待 C++11

我有以下结构

由写入线程和读取线程使用。读者必须尽快对新值做出反应。为此,我在阅读器中实现了以下内容:

此操作非常占用处理器资源。我选择了这种方法,因为我相信它比使用条件变量然后在数据更改时等待读取器线程被唤醒要快。此外,数据更新非常频繁,每秒数百次。有没有更好的方法来做到这一点,同时仍然具有最快的反应时间?

0 投票
2 回答
194 浏览

c# - 基于 CompareExchange 的联锁实现是否应该使用 SpinWait?

下面是一个基于Interlocked.CompareExchange.

是否建议此代码在重复之前使用SpinWait旋转?

我已经看到SpinWait在这种情况下使用过,但我的理论是它应该是不必要的。毕竟,循环只包含少量指令,并且总是有一个线程在进行。

假设两个线程竞相执行此方法,第一个线程立即成功,而第二个线程最初没有更改,必须重复。在没有其他竞争者的情况下,第二个线程是否有可能在第二次尝试时失败

如果示例的第二个线程在第二次尝试时不能失败,那么我们可以通过 a 获得SpinWait什么?万一有一百个线程竞相执行该方法,是否可以缩短几个周期?

0 投票
2 回答
304 浏览

c# - SpinWait.SpinUntil 在等待 Selnium 元素存在时退出的时间比超时时间长得多

我有一个相对简单的方法来等到元素存在并显示出来。该方法处理为给定的 By 返回多个元素的情况(通常我们只希望显示其中一个,但无论如何该方法将返回找到的第一个显示元素)。

我遇到的问题是,当页面上(根本)没有匹配的元素时,它所花费的时间比指定的 TimeSpan 还要多*,我不知道为什么。

*我刚刚测试了 30s 的超时时间,花了 5m 多一点

代码:

你可以这样称呼它:

如果您运行测试(超时 10 秒),您会发现实际退出大约需要 100 秒。

看起来它可能与包含在 SpinWait.WaitUntil() 中的 WebDriver.FindElements() 中内置的继承等待的混合有关。

想听听你们对这个难题的看法。

干杯!

0 投票
1 回答
118 浏览

assembly - 为什么 AMD-CPU 有这么愚蠢的暂停时间

我已经为 C++ 开发了一个类似于 Java 的监视器对象,并进行了一些改进。主要的改进是不仅有一个用于锁定和解锁的自旋循环,还有一个用于等待事件的循环。在这种情况下,您不必锁定互斥体,而是在 wait_poll-function 上提供谓词,并且代码反复尝试锁定互斥体轮询,如果它可以锁定互斥体,则调用返回(或移动)对的谓词布尔型和结果类型。

等待内核中的信号量和/或事件对象 (Win32) 可以轻松地从 1.000 到 10.000 个时钟周期,即使调用立即返回,因为之前已设置信号量或事件。所以必须有一个与这个等待间隔有合理关系的旋转计数,fe 旋转内核中花费的最小间隔的十分之一。

使用我的监视器对象,我从 glibc 中获取了自旋计数重新计算算法。而且我也在使用暂停指令。但我发现在我的 CPU(TR 3900X)上,暂停指令太快了。平均约为 0.78ns。在 Intel-CPU 上,大约 30ns 更合理。

这是代码:

为什么 AMD 采取了如此愚蠢的暂停时间?PAUSE 用于自旋等待循环,并且应该与高速缓存行内容翻转到不同核心并返回所需的时间非常匹配。