问题标签 [spinlock]
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.
c# - 为什么每个人都说 SpinLock 更快?
我在互联网上阅读了很多文档、文章和帖子。几乎所有人和任何地方都认为 SpinLock 对于运行较短的代码片段更快,但我做了一个测试,在我看来,简单的 Monitor.Enter 比 SpinLock.Enter 工作得更快(测试是针对 .NET 4.5 编译的)
在具有 24 个 2.5 GHz 内核的服务器上,此应用程序使用 x64 编译产生以下结果:
c# - C# 中的自旋锁。在哪种算法中 SpinLock 是对 Monitor 的更好选择?
可能重复:
为什么每个人都说 SpinLock 更快?
这个问题是关于 SpinLock、Monitor & Interlocked。
我做了 2 个测试来测试 的性能,Monitor
这些测试让我感到困惑。SpinLock
Interlocked
我的困惑特别是关于SpinLock
真正的速度有多快。根据我的测试SpinLock
,它比Monitor
. 但是基于一些文档和文章SpinLock
应该提供性能增益。
现在我想知道在哪些情况下会SpinLock
提高性能?
您可以在下面找到有关我执行的测试的一些详细信息:
在第一次测试中,我创建了几个线程(就像我拥有的许多硬件线程一样)访问同一个共享锁对象,执行非常短的操作(或根本没有操作:这只是一个测试)。
在第二个测试中,我创建了一个元素数组,并且很少有线程随机访问该数组中的元素。每个元素都包含自己的锁定对象:System.Object
for Monitor
test,SpinLock
object for SpinLock
test,对于Interlocked.Increment
,线程使用数组元素内部的int类型的公共变量来执行Interlocked.Increment
操作。
在每个测试中,对共享区域的访问都是循环执行的。每个测试由 3 个例程组成:
- 测试自旋锁
- 测试监视器
- 测试增量.联锁
每次测试都显示SpinLock
比 慢Monitor
。所以,自从我进行了提到的测试以来,困扰我的问题是哪些场景适合于由SpinLock
发布测试代码以提供详细信息:
(这两个测试都是针对 .net 4.5 编译的)
测试 1,线程试图获得对同一个共享锁定对象的独占访问权限
测试2,线程试图获得对数组元素的独占访问权,这些元素是随机挑选的,即低竞争测试
附加测试 3. 测试在单个线程中执行。线程访问锁的最高机会。
据我了解,第三次测试是最好的SpinLock
选择。完全没有争议。单线程 - 顺序执行。为什么SpinLock
还远远落后Monitor
?谁能给我指出一些可以证明我SpinLock
有用的代码(设备驱动程序开发除外)?
c - 对于这种特殊情况,我应该使用 spin_lock 还是 mutex_lock?
在我的 Linux 应用程序中,我有两个线程都尝试使用相同的客户端套接字发送UDP
广播数据包(大约 50-500 字节) 。UDP
他们大约每 2-3 秒执行一次。在这种情况下,围绕“send(...)”子句,我可以放置pthread_mutex_lock
or pthread_spin_lock
。理论上说,如果它是一个非常小的操作,那么 apthread_spin_lock
会更有效(尽管 CPU 消耗量很小)。但如果是更大的手术,那就pthread_mutex_lock
更好了。
发送一个UDP
数据包是否被认为“足够小”以保证使用 a pthread_spin_lock
,或者我仍然应该坚持使用pthread_mutex_lock
?
谢谢
c++ - 用 boost::detail::spinlock 替换关键部分导致 Windows 死锁
我的平台是 vs2010 win2003 服务器,我有一个运行良好的应用程序。有一个整数受临界区保护,当我修改并使用 boost::detail::spinlock 时,它会进入死锁。
c++ - 可以将自旋锁与 O(1) 非内存连续代码一起使用吗?
我在锁定代码部分使用通常O(1)列表元素访问/删除的自旋锁( pthread )。
我说一般是因为在 99.9% 的情况下,代码不会遍历列表(可能包含 1000 多个元素)。
该代码通常会根据列表元素提示指针仅提取一个元素,然后执行几个if分支来修改引用的提示元素;它仍然应该是对内存的非连续访问。
使用自旋锁是个好主意还是应该转向互斥锁?
我的目标是最大性能,在这种情况下不关心 CPU(过度)使用。
干杯
c++ - C++ - 互斥锁和自旋锁的初始化和销毁
是否可以在一个线程中分配和初始化互斥锁并在另一个线程中销毁它?
谢谢。
synchronization - 单处理器和多处理器中的自旋锁
我阅读并研究了自旋锁是如何工作的。现在我有一个问题,我找不到详尽的答案:
它们如何在 UP(单处理器)环境和 SMP(对称多处理器)环境中工作?有什么区别和问题?
multithreading - 为什么线程尝试两次获取相同的自旋锁时会出现死锁?
有人可以向我解释为什么当一个线程尝试两次获取同一个自旋锁时会出现死锁吗?(假设自旋锁是非递归的)
常规自旋锁用法:
但是,我不明白为什么第二次调用acquiring_lock(lock)
会导致死锁?
assembly - 在 ARM 中使用 STREXEQ 代替 STREX 实现自旋锁
以下是 ARM 手册中的示例自旋锁实现。请在此处查看:http: //infocenter.arm.com/help/topic/com.arm.doc.genc007826/Barrier_Litmus_Tests_and_Cookbook_A08.pdf 。关于“使用带有锁的等待事件 (WFE) 和发送事件 (SEV)”的部分。
锁码:
解锁代码:
问题:为什么使用 STREXEQ?如果使用 STREX 会怎样?据我了解,strexeq 只有在设置了 EQ 标志时才会执行。但是不管怎样,如果没有设置 EQ,那么 WFENE 会确保我们在等待事件吗?那么 STREX EQ是不是不必要的呢?
提前致谢!
c - linux中do_raw_spin_lock函数是如何实现的
在调试与自旋锁相关的恐慌问题时,我遇到了自旋锁的这个定义
包括/linux/spinlock.h
. 我很难理解这个定义。为什么要__acquires(lock)
在do_raw_spin_lock
函数之后使用?这样的声明有何意义?
请帮助我如何解码和工作这样的声明。