问题标签 [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 投票
3 回答
990 浏览

c# - 在等待新线程产生时调用 thread.sleep()

我想这个问题可以归结为“SpinWait vs. Block?”,但我认为可能有一个更有趣的答案来解释为什么几乎每个 C# 线程教程都建议以下调用:

而不是像这样阻塞:

我的蛮力测试(围绕调用 DateTime.Ticks 的 while 循环)并没有真正揭示任何东西(说两种情况下的差异都是 0 滴答声)。

线程创建过程是否足够短以至于旋转更有效?还是大多数教程都建议旋转,因为它稍微优雅一些​​并且时差可以忽略不计?

0 投票
3 回答
489 浏览

.net - .Net 框架中是否有使用自旋锁或自旋等待的示例?

我查看了并发集合,但它们似乎在引擎盖下使用了普通锁定。.Net 框架中有没有使用这种锁定结构的好例子?


我最初查看的是 ConcurrentDictionary。我看到它使用的是普通锁,但 BlockingCollection 类在其内部方法中使用了 SpinWait。

0 投票
2 回答
434 浏览

.net - 省电 SpinWait

我在 C# 中有一个轮询循环,平均需要每 100 微秒轮询一次 <EDIT>(当然,由于核心短缺,Windows 没有进行过多的抢占式线程上下文切换)</EDIT>

由于没有时间重新安排,Sleep(1) 不会这样做。

所以我决定专用一个线程(实际上,在设置亲和力时,一个核心)并使用 Thread.SpinWait 为每次迭代的一组周期。虽然这很好用,但它消耗了不必要的电量。100 微秒足以让 CPU 暂停(但不足以让线程从调度程序中临时删除,因为 Windows 时间片会很长)。

相反,我正在考虑使用 Intel PAUSE 指令,但我不确定它是否会触发 Intel CPU 暂停硬件线程。英特尔声称它可以保存功率并且应该在自旋循环中使用,但由于暂停时间长达 100 微秒,我真的希望内核进入 C1 模式睡眠。

有任何想法吗?

编辑:我正在轮询第三方 API,因此没有要阻止的同步事件。

0 投票
1 回答
1350 浏览

nutch - nutch crawling 卡在 spinwaiting 或 active 中。如何减少获取周期?

我正在使用 nutch 2.1 并爬取一个站点。问题是爬虫一直显示获取 url spinwaiting/active 并且由于获取需要很长时间,因此与 mysql 的连接超时。我怎样才能减少一次提取的次数,使mysql不会超时?nutch 中是否有一个设置,我可以说只获取 100 或 500 个 url,然后解析并存储到 mysql,然后再次获取下一个 100 或 500 个 url?

错误信息:

0 投票
2 回答
638 浏览

c# - NET 4.0 SpinWait 方法与 4.0 之前的 SpinWait() 方法有何不同?

MSDN “线程安全集合 .NET Framework 4”指出:

“一些并发集合类型使用轻量级同步机制,例如SpinLockSpinWaitSemaphoreSlimCountdownEvent,它们是 .NET Framework 4 中的新功能”

而 MSDN 网站告诉SpinWaitwas 在 .NET 1.1 中可用,而另一篇 MSDN 文章从 .NET 4.0 开始 SpinWaitwas

好吧,好奇来自 Lee Grissom 的评论,回答SynchronizedCollection 和其他并发集合有什么区别?

“@Matt,.NET4 并发类使用SpinWait对象来解决线程安全问题,而不是 Monitor.Enter/Exit(又名关键部分)?”

以及第一个 NSDN 引用说明这SpinWait是 .NET 4.0 的新内容

那么,它是不是新的?
如果是新的,那怎么办?

0 投票
3 回答
2569 浏览

c# - 为什么 .NET 内部 Hashtable 中有一个 Thread.Sleep(1)?

最近我在阅读 .NET Hashtable的实现,遇到了一段我不明白的代码。部分代码是:

整个代码在public virtual object this[object key]( System.Collections.Hashtablemscorlib Version=4.0.0.0) 之内。

问题是:

在那里的原因是什么Thread.Sleep(1)

0 投票
0 回答
265 浏览

c# - 为什么在 Albahari 的“C# 中的线程”中的 LockFreeUpdate 示例中需要 SpinWait

我正在Ref<T>使用无锁乐观更新方法进行小型抽象(应该使用不可变T数据结构,特别是不可变树)。它基于SpinWait 使用LockFreeUpdate部分中 Albahari 的“C#中的线程”方法:

我的问题是为什么我们在这里需要 SpinWait? 因为如果字段已经更新,那么另一个并发代码可以立即从新值重试更新。

下面提供了没有 SpinWait 的完整 Ref 代码(检查Update方法以进行比较):

0 投票
1 回答
1008 浏览

c# - For循环中的随机数

嗨,我已经在整个互联网上搜索了这个答案,请在我进入实际问题之前让我解释一下。它可能看起来很简单,但真正帮助我的唯一选择是 Thread.Sleep 和 Thread.SpinWait 但它基本上在它的睡眠和旋转等待期间停止我的程序也不允许我把它放在一个特定的时间,比如秒数最重要的是。我也尝试过使用内置计时器,但我不知道如何获取/创建回调计时器或创建计时器所需的内容。我还在我的其他项目中的while循环中使用了一个简单的计时器(如下)


.

现在这是我的实际问题,我已经有超过 3 周的时间了,只是因为我在互联网上使用谷歌、论坛、帮助网站等进行搜索而变得更加困惑。我生成了几个彼此相对接近的数字,并且我连续多次获得相同的数字,因此如上所述,我使用了效果最好的睡眠和等待计时器,但它们的缺陷使我不想使用它们,或者我无法正确使用它们。下面的代码只是我在 for 循环中调用的函数中使用随机数并一遍又一遍地获取相同数字的一个实例。

这就是我调用轮盘赌函数的地方。

正如你所看到的那样,它会生成新的数字,不幸的是,当它休眠时,我的程序的其他区域(如绘图功能)也不会改变(我需要它)但我使用的计时器确实count 达到正确的值,但在创建随机值时实际上并没有停止或延迟(我认为 while 循环会有所帮助)。我知道随机性是如何依赖时间的,这是所述依赖的副作用。此外,我在搜索此解决方案时访问的站点中也经常听到“种子”一词,我通过播种我的随机数或我可以得到它来改变随机数的值来理解它。

那么如何在不停止程序的其余部分的情况下让它以它需要的方式工作(比如某些语言或引擎如何有一个等待计时器,它只像统一的 waitforseconds 一样充当程序这一部分的延迟)?

如果我的措辞很奇怪,我很抱歉,我只是在这方面遇到了很多麻烦,现在是凌晨 2 点 30 分,我很难在这个问题上入睡。

0 投票
1 回答
606 浏览

c++ - Linux 和 Mac OS X 上的 Windows .NET (C++) SpinWait 是什么?

Windows .NET (C++) 通过 YIELD/PAUSE 指令为超线程友好的忙等待提供 SpinWait。Linux 和 Mac OS X 上的等效功能是什么?如果系统调用不可用,如何在用户空间实现等价的?

请参阅Windows 线程::SpinWait

有关自旋等待的性能问题的讨论,请参阅启用超线程技术的英特尔处理器上的长时间自旋等待循环。

0 投票
1 回答
306 浏览

c# - 无锁更新中的 SpinWait

在阅读Albahari's Threading in C#时,我注意到“无锁更新”模式SpinWait在循环结束时使用 a :

注意最后的spinWait.SpinOnce()调用。这个调用是否只需要在单线程环境中产生线程,还是有其他目的?