问题标签 [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.

0 投票
2 回答
1213 浏览

file-io - 跨平台和跨进程原子 int 写入文件

我正在编写一个应用程序,它必须能够处理对它的许多并发访问,无论是通过线程还是通过进程。因此,不应对此应用互斥锁或锁。

为了使锁的使用降到最低,我将文件设计为“仅附加”,因此所有数据首先附加到磁盘,然后指向它已更新的信息的地址被更改指新的。所以我只需要实现一个小锁系统来更改这个 int 以便它引用新地址。最好的方法是什么?

我在考虑可能在地址前放置一个标志,当它被设置时,读者将使用自旋锁直到它被释放。但我担心它根本不是原子的,是吗?例如

  • 阅读器读取标志,并且未设置
  • 同时,写入者写入标志并更改 int 的值
  • 读者可能会读到不一致的值!

我正在寻找锁定技术,但我发现的只是线程锁定技术,或者锁定整个文件,而不是字段。难道不能这样做吗?仅附加数据库如何处理这个问题?

编辑:我正在研究仅附加数据库(couchDB)是如何做到的,似乎他们只使用一个线程来序列化对文件的写入。这是否意味着如果不使用文件系统锁锁定整个文件,就不可能像 sqlite 一样使它们可嵌入?

谢谢!考埃

0 投票
2 回答
4653 浏览

language-agnostic - 自旋锁是如何在底层实现的?

这是一个锁,一次只能由一个执行线程持有。另一个执行线程尝试获取锁会导致后一个循环,直到锁被释放。

当两个线程试图同时获取锁时,它是如何处理

我认为这个问题也适用于其他各种互斥体实现。

0 投票
2 回答
619 浏览

multithreading - C# 4.0 BCL SpinLock 在无法获得锁时会旋转/阻塞吗?

给定以下代码:

如果 Enter 块“失败”,因为它在获取锁时收到 false,那么当前线程是否像自旋锁一样旋转并等到它可以获取它,或者这个块只是被绕过并且该线程丢失了?

谢谢,

斯科特

0 投票
1 回答
1203 浏览

linux-kernel - spinlock和cli一起使用

我最近从http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.1.tar.bz2下载了 linux 源代码。我在 linux-2.6.34.1\Documentation 文件夹中名为 spinlocks.txt 的文件中遇到了以下段落。

“这确实意味着如果你有一些代码

和另一个序列

那么它们不是互斥的,关键区域可以同时发生在两个不同的 CPU 上。这本身很好,但关键区域最好对不同的事情至关重要(即它们不能相互踩踏)。"

如果某些代码使用 cli()/sti() 并且同一代码的其他部分使用 spin_lock_irqsave(flags)/spin_unlock_irqrestore(flags) ,它们会如何影响?

0 投票
4 回答
3381 浏览

locking - 非抢占式 Linux 内核上的 spin_lock

我在具有 1 个 CPU 和非抢占式 linux 内核(2.6.x)的系统上读到,spin_lock 调用相当于一个空调用,因此以这种方式实现。

我无法理解:它不应该等同于在互斥体上休眠吗?例如,即使在非抢占式内核上,中断处理程序仍可能会被执行,或者我可能会调用一个使原始线程进入睡眠状态的函数。因此,如果将空的 spin_lock 调用实现为互斥锁,则它不是“安全的”。

有什么我不明白的吗?

0 投票
1 回答
668 浏览

assembly - 为什么 Linux 内核中的自旋锁在“.subsection 1”(或“.text.lock.smth”)中?

在linux内核中自旋锁的实现,例如 http://lxr.linux.no/#linux+v2.6.18/include/asm-i386/semaphore.h#L97

使用 LOCK_SECTION_START 和 LOCK_SECTION_END。它们在http://lxr.linux.no/#linux+v2.6.18/include/linux/spinlock.h#L63中定义为

所以所有锁定的操作都部分放入subsection 1或部分.text.lock.SMTH_STRING。

这是什么原因?

0 投票
4 回答
3881 浏览

linux-kernel - How can I use spinlocks on list entries inside the linux kernel?

I'm developing a patch for the linux kernel. I have to use several lists and I have to protect'em against concurrent modification on a multicore machine. I'm trying to use spinlocks for this goal, but there's something I can't understand. I have to lock the entries of a list (I'm using linux default implementation of linked lists) and it can happen that a process invokes a syscall to remove one element of the list while the same element which is locked because some modification is actually being made on it. If I insert a spinlock inside the list entry, what happens if a process manage to remove it while someone is spinlocking on it?? Should I lock the entire list? I'm looking for a piece of code that can explain how to do handle this situation.

For example, this code shouldn't work (see comment on the last line of code):

#xA;

Can you help me??

0 投票
1 回答
257 浏览

semaphore - CMU:信号量

请检查我对信号量的理解!

我理解计数信号量和二进制信号量背后的想法。然而,用 signal() 和 wait() 实现的自旋锁和信号量之间的区别对我来说是混合在一起的。

例如,自旋锁基本上有两个值(锁定或解锁的二进制真/假)。因此自旋锁基本上是一个二进制信号量,对吗?

任何试图在另一个进程处于临界区时进入临界区的进程在它被锁定时将无法进入,并且将旋转并不断检查锁定状态,直到它被解锁然后能够进入并锁定它。

使用 signal() 和 wait() 函数的信号量本质上是从某种变量中添加或减去值。关于临界区有一个约束。只有当变量具有某种值时才会打开它。消费者进程的示例实现是等待(满),然后当它满时执行,最后发出信号(空)。而生产者进程可能会等待(空)并在空为真时执行,然后在完成时发出信号(满)。

wait() 和本质上在循环中“等待”的自旋锁有什么区别?

0 投票
2 回答
6723 浏览

linux-kernel - 拿着自旋锁避免睡觉

我最近阅读了 LDDv3 书的第5.5.2节(自旋锁和原子上下文):

持锁时避免睡觉可能会更加困难;许多内核函数可以休眠,而且这种行为并不总是有据可查。将数据复制到用户空间或从用户空间复制数据就是一个明显的例子:在复制可以继续之前,可能需要从磁盘换入所需的用户空间页面,并且该操作显然需要休眠。几乎任何必须分配内存的操作都可以休眠;kmalloc 可以决定放弃处理器,并等待更多内存可用,除非明确告知不要这样做。睡眠可能发生在令人惊讶的地方;编写将在自旋锁下执行的代码需要注意您调用的每个函数

我很清楚,自旋锁必须始终保持尽可能短的时间,而且我认为从头开始编写正确的使用自旋锁的代码相对容易。

然而,假设我们有一个广泛使用自旋锁的大型项目。我们如何确保从受自旋锁保护的关键部分调用的函数永远不会休眠?

提前致谢!

0 投票
2 回答
1470 浏览

windows - 在 Windows 中,如何最好地同步内核和用户空间之间共享的内存访问

我在 Win32 API 中找不到任何获取自旋锁的函数。
有原因吗?

当我需要使用自旋锁时,我该怎么办?

我知道有一个 CriticalSectionAndSpinCount 函数。
但这不是我想要的。

编辑:
我想同步一个将在内核空间和用户空间之间共享的内存。-内存将被映射。
当我访问数据结构时我应该锁定它,锁定时间会很短。
数据结构(假设它是一个队列)管理事件句柄以相互交互。
我应该使用什么同步机制?