spinlock相关内容

Intel Inspector 在我的自旋锁实现中报告了数据竞争

我使用 Windows 中的 Interlocked 函数制作了一个非常简单的自旋锁,并在双核 CPU(两个线程递增一个变量)上对其进行了测试; 该程序似乎工作正常(每次都给出相同的结果,在不使用同步时情况并非如此),但 Intel Parallel Inspector 说在 value += j(见下面的代码).使用关键部分而不是我的 SpinLock 时,警告会消失. 我的 Spi ..
发布时间:2022-01-22 20:25:40 C/C++开发

x86 暂停指令如何在自旋锁中工作 * 和 * 是否可以用于其他场景?

pause 指令通常用于测试循环spinlock,当其他一些线程拥有自旋锁时,以减轻紧密循环.据说相当于一些NOP指令.有人能告诉我它究竟是如何用于自旋锁优化的吗?在我看来,即使是 NOP 指令也是浪费 CPU 时间.它们会降低 CPU 使用率吗? 另一个问题是我是否可以将暂停指令用于其他类似目的.例如,我有一个繁忙的线程,它不断扫描某些地方(例如队列)以检索新节点;然而,有时队列是空的,线 ..

spin_lock_irqsave 与 spin_lock_irq

在 SMP 机器上,我们必须使用中断上下文中的 spin_lock_irqsave 而不是 spin_lock_irq. 为什么我们要保存标志(包含 IF)? 还有其他中断例程可以打断我们吗? 解决方案 如果在您的代码开始锁定之前已经禁用了中断,则当您调用 spin_unlock_irq 时,您将在可能不需要的情况下强制重新启用中断方式.相反,如果您还通过 spin_lock_ ..
发布时间:2022-01-04 22:37:00 其他开发

使用 imageAtomicCompSwap 的 GLSL 每像素自旋锁

OpenGL 红皮书版本 9 (OpenGL 4.5) 示例 11.13 是简单的每像素互斥.它在 do {} while() 循环中使用 imageAtomicCompSwap 来获取每个像素的锁,以防止在对应于同一像素的像素着色器调用之间同时访问共享资源坐标. layout (binding = 0, r32ui) 统一 volatile 相干 uimage2D lock_image;无效主 ..
发布时间:2021-12-19 17:50:12 其他开发

C ++ Standard如何使用memory_order_acquire和memory_order_release防止自旋锁互斥锁中的死锁?

TL:DR:如果互斥体实现使用获取和释放操作,则实现是否可以像通常允许的那样进行编译时重新排序,并将与独立于不同锁的两个关键部分重叠?这将导致潜在的僵局. 假设互斥锁在 std :: atomic_flag : 结构互斥量{无效锁(){while(lock.test_and_set(std :: memory_order_acquire)){yield_execution();}}无效解锁 ..
发布时间:2021-05-28 20:17:31 C/C++开发

自旋锁所需的最少X86组件是多少?

在组装中实现自旋锁.在这里,我发布了一个我想出的解决方案.这是正确的吗?你知道矮个子吗? 锁定: mov ecx, 0 .loop: xchg [eax], ecx cmp ecx, 0 je .loop 版本: lock dec dword [eax] eax初始化为-1(这意味着锁定是免费的).这应该适用于许多线程(不一定是2个 ..
发布时间:2020-07-08 19:44:03 其他开发

为什么获取语义仅用于读取而不是写入? LL/SC如何获取CAS锁定而又不对商店的关键部分进行重新排序?

首先,请考虑发布语义.如果数据集受到自旋锁的保护(互斥锁等-不管使用哪种确切的实现;就目前而言,假定0表示空闲,而1-忙).更改数据集后,线程将0存储到自旋锁地址.为了在将0存储到自旋锁地址之前强制所有先前动作的可见性,使用释放语义执行存储,这意味着在进行此存储之前,所有其他线程都应可以看到所有先前的读写操作.这是实现细节,是用完全存储屏障还是单个存储操作的释放标记来完成. (我希望)毫无疑问是清 ..

自旋锁vs忙等待

请解释为什么忙碌等待通常不被接受,而旋转通常被认为是可以的.据我所知,它们都无限循环直到满足某些条件. 解决方案 自旋锁通常在资源争用较少的情况下使用,因此CPU在此之前只会进行几次迭代它可以继续进行富有成效的工作.但是,锁定功能的库实现通常使用自旋锁,后跟常规锁.如果无法在合理的时间范围内获取资源,则使用常规锁定.这样做是为了减少通常可快速获得锁的设置中上下文切换的开销. 术语繁忙 ..
发布时间:2020-07-08 19:43:56 其他开发

自旋锁是否总是需要内存屏障?在内存屏障上旋转是否昂贵?

我写了一些无锁代码,可以在本地使用 在大多数情况下都可以读取. 在内存上进行局部旋转是否必然意味着我 必须始终在旋转之前插入存储屏障 阅读吗? (为验证这一点,我设法产生了一个读取器/写入器 导致读者永远看不到 书面价值,在某些非常具体的情况下 条件-专用CPU,附加到CPU的进程, 优化器一路调高,没有其他工作 循环-箭头确实指向该方向,但我不是 完全确定通过内存旋转的成本 障碍.) ..
发布时间:2020-07-08 19:43:53 其他开发

“自旋锁"到底是什么?

我总是想知道它们是什么:每次我听到它们的声音时,类似飞轮的未来派设备的图像就会在我的脑海中跳舞(滚动?). 他们是什么? 解决方案 当您使用常规锁(互斥锁,关键节等)时,操作系统会将您的线程置于WAIT状态,并且此外,内核对象并非在内核的每个状态下都可用,例如在中断处理程序中或分页不可用时等. 自旋锁不会引起先占,而是循环等待(“自旋"),直到另一个内核释放锁为止.这样可以防止 ..
发布时间:2020-07-08 19:43:50 其他开发

使用imageAtomicCompSwap的GLSL每像素自旋锁

OpenGL红皮书版本9(OpenGL 4.5)示例11.13是简单的每像素互斥体.它在do {} while()循环中使用imageAtomicCompSwap进行每像素锁定,以防止在同一像素坐标对应的像素着色器调用之间同时访问共享资源. layout (binding = 0, r32ui) uniform volatile coherent uimage2D lock_image; ..
发布时间:2020-05-14 02:12:42 其他开发

Thread类的onSpinWait()方法-Java 9

在学习Java 9功能时,我遇到了Thread类的新方法,称为 指示呼叫者暂时无法继续通话,直到 其他活动发生了一项或多项动作. 有人可以帮助我理解这种方法的真实示例或场景吗? 解决方案 与x86操作码PAUSE相同(并且可能会编译为),并等效于Win32宏YieldProcessor,GCC的__mm_pause()和C#方法Thread.SpinWait 这是一种非常弱化 ..
发布时间:2020-05-13 22:32:29 Java开发

Mutex,Semaphore&之间的区别旋转锁

我正在使用IPC进行实验,尤其是Mutex,Semaphore和Spin Lock. 我了解到的是Mutex用于异步锁定(具有睡眠(根据我在NET上阅读的理论)机制),信号量是同步锁定(具有信令和睡眠)机制,而自旋锁是同步但非睡眠机制. 有人可以帮助我进一步澄清这些内容吗? 当我用线程&编写程序时,还有另一个关于Mutex的疑问.互斥锁,当一个线程正在运行时,另一个线程不处于睡眠状态,但是它 ..
发布时间:2020-05-13 21:00:14 其他开发

x86暂停指令如何在自旋锁中工作,并且*可以在其他情况下使用吗?

暂停指令通常在测试 spinlock 的循环中使用,而其他一些线程拥有自旋锁,以减轻紧密循环.据说这等效于一些NOP指令.有人可以告诉我自旋锁优化的工作原理吗?在我看来,即使是NOP指令也浪费了CPU时间.它们会减少CPU使用率吗? 另一个问题是我可以将暂停指令用于其他类似目的.例如,我有一个繁忙的线程,该线程不断扫描某些地方(例如队列)以检索新节点;但是,有时队列为空,线程正浪费CPU时间 ..
发布时间:2020-05-13 20:44:57 其他开发

自旋锁如何防止过程中断?

我在此站点上读到一个答案,说自旋锁减少了上下文切换的开销,然后我阅读了与此相关的教科书声明: 自旋锁使繁忙的等待程序不被中断. 我的问题是标题. 由于这本书使用while循环来表示自旋锁的 spin 部分的实现,因此以下是我根据这种考虑尝试说明自己的理由 这听起来像是,如果有一个程序有一个忙于等待的while循环,那么所有其他程序(进程)将不会永远执行,但这不会使多程序环境 ..

进程上下文和计时器功能之间的同步

我想在进程上下文(具体来说,在queuecommand函数中)和计时器函数中自动更新数据结构.在过程上下文中,我应该使用spin_lock_bh还是spin_lock_irq还是仅使用spin_lock? 据我了解,我们应该在queuecommand(进程上下文)中使用spin_lock_bh,而在计时器函数中仅使用spin_lock.我说得对吗? 解决方案 如果我正确理解,那是关于 ..
发布时间:2020-05-02 03:48:34 服务器开发

非抢占式Linux内核上的spin_lock

我了解到,在具有1个CPU和非抢占式Linux内核(2.6.x)的系统上,spin_lock调用等效于一个空调用,并以此方式实现. 我不明白:这不应该等同于互斥锁上的睡眠吗?甚至在非抢占式内核上,中断处理程序可能仍会执行,例如,或者我可能会调用使原始线程进入睡眠状态的函数.因此,并非空的spin_lock调用是“安全的",就像将其实现为互斥锁一样. 我有没有得到的东西? 解决方案 ..
发布时间:2020-05-02 03:31:15 其他开发

为什么自旋锁在单处理器(单核)系统中不起作用?

我知道自旋锁可以与自旋一起使用,存在不同的内核路径并且内核是抢占式的,那么,为什么自旋锁在单处理器系统中不起作用? (例如,在Linux中) 解决方案 如果我理解您的问题,您是在问为什么自旋锁在单核计算机上不是一个好主意. 它们应该仍然可以工作,但比真正的线程睡眠并发要昂贵得多: 使用自旋锁时,实际上是在断言您不必等待很长时间.您说的是,您认为通过繁忙的循环维护处理器时间片要比 ..
发布时间:2020-05-02 03:28:59 其他开发