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

c - 用 C 语言调试 Lamport's Bakery 算法的简化版

在尝试使用它解决更复杂的问题之前,我正在尝试在 C 中实现 Lamport's Bakery Algorithm 的简化版本。* 我所做的简化是锁仅由两个线程而不是 N 共享。

我设置了两个线程(通过 OpenMP 使事情变得简单),它们循环,试图在它们的关键部分增加一个共享计数器。如果一切都按计划进行,那么最终的计数器值应该等于迭代次数。但是,这里有一些示例输出:

嗬!有些东西坏了,但是什么?我的实现是相当教科书(供参考),所以也许我在滥用内存屏障?我是否忘记将某些内容标记为易失性?

我的代码:

要编译和运行(在 Linux 上),请执行以下操作:

  • 我打算将简单的 Bakery 锁链接成二叉树(锦标赛风格),以实现 N 个线程之间的互斥。
0 投票
1 回答
857 浏览

linux - Linux 的混合互斥库

是否有任何实现混合互斥功能的 Linux 标准线程库?我的意思是,一个互斥锁,起初“表现得像一个自旋锁”并且“只有在一定时间(或重试或任何其他测量因素)后仍未获得锁时,线程才真正进入睡眠状态”,正如 Mecky 在什么时候应该使用自旋锁而不是互斥锁?

0 投票
1 回答
1462 浏览

c - 如何监控linux自旋锁等待时间?

我阅读了linux内核中的自旋锁功能代码。有两个与自旋锁相关的函数。请看下面的代码:

我有两个问题:

1.以上两个功能有什么区别?

2.如何监控spinlock的等待时间(第一次尝试锁,最后拿到锁的时间)?变量inc是指spinlock的等待时间吗?

0 投票
2 回答
62 浏览

c - 用原子替换条件?

我的代码中有一个条件,如下所示

我使用自旋锁为了使上述线程安全,并确保每个线程获得与前一个相比的下一个 round_robin_next_ 值。如您所见,round_robin_next_ 是循环的,上升到某个值并返回 0。

我的问题是上面可以通过使用 gcc 内在函数以某种方式释放锁吗?或一些平台特定的说明?我在使用 gcc 4.7 的 64 位 Linux 上,我对平台特定的解决方案很好,如果它不能被移植也没关系。

0 投票
0 回答
608 浏览

linux - ARM 和 Linux spin_lock_irqsave 关注

这是我在堆栈交换中的第一个查询,所以请多多包涵。我想到的几乎所有问题都已经从论坛上得到了解决,但我找不到这个。

我在 Linux 中制作了一个简单的设备驱动程序,在 my_init() 函数中我编写了以下代码:-

因此,我只是在没有释放自旋锁的情况下返回。根据理论和 Linux 源代码,中断在 ARM 中被禁用。所以我看到 ARM 的 CPSR 寄存器使用带有“I”位的调试器被屏蔽,因此 IRQ 被禁用。然而令我惊讶的是,Linux 提示符甚至 schedule() 函数都照常工作。

所以我的问题是在 Linux 中我们是否只对某些外围设备使用 IRQ 模式?如果是这种情况,我们如何保证线程上下文和中断上下文之间的完美同步?

关于我的目标的一些细节:TI81xx Soc、Linux 3.2、劳特巴赫调试器。

谢谢

0 投票
1 回答
2682 浏览

linux-kernel - 为什么这段代码会死锁?

我在可加载模块中创建了 2 个 Linux 内核线程,并将它们绑定到在双核 Android 设备上运行的单独 CPU 内核。在我运行了几次之后,我注意到设备重新启动并重置了硬件看门狗定时器。我一直在解决这个问题。什么可能导致僵局?

基本上,我需要做的是,确保两个线程在不同的内核上同时运行 do_something() 而没有任何人窃取 cpu 周期(即中断被禁用)。我为此使用了自旋锁和 volatile 变量。我还有一个信号量供父线程等待子线程。

0 投票
4 回答
8410 浏览

kernel - 为什么linux在内核代码持有自旋锁后禁用内核抢占?

我是 Linux 新手,正在阅读 Rubini & Corbet 的 Linux 设备驱动程序书。我对与以下内容相关的一项声明感到困惑spinlocks;这本书说

如果一个非抢占式单处理器系统曾经在锁上自旋,它将永远自旋;没有其他线程能够获得 CPU 来释放锁。出于这个原因,没有启用抢占的单处理器系统上的自旋锁操作被优化为什么都不做,除了那些改变 IRQ 屏蔽状态的操作。

书中进一步指出

内核抢占情况由自旋锁代码本身处理。每当内核代码持有自旋锁时,相关处理器上的抢占都将被禁用。甚至单处理器系统也必须以这种方式禁用抢占以避免竞争条件。

问题:在单处理器系统上,如果内核抢占在内核代码(代表用户进程执行)持有自旋锁时被禁用,那么另一个进程如何有机会运行并因此尝试获取自旋锁?当内核代码持有自旋锁时,为什么 Linux 内核会禁用内核抢占?

0 投票
1 回答
1147 浏览

linux - 在 linux 内核中,对 kfree 的调用会一直休眠吗?

标题几乎是问题...

我正在编写一些使用自旋锁来帮助列表管理的代码。关于自旋锁的文档非常清楚不要调用任何会休眠的东西。我知道有一些方法可以分配“原子”内存,但我还没有看到任何关于 kfree 或释放内存的信息。

直觉告诉我它不应该睡觉,但我还没有发现这是明确的。

0 投票
2 回答
1061 浏览

c# - 带自旋锁的自定义锁

我看不到错误,也许有人可以在这里帮助我。

我有一个使用自旋锁的自定义锁(这是学校用的)

我得到的例外如下:

System.ArgumentException 未处理

Message=在调用此方法之前,takeLock 参数必须设置为 false。

0 投票
1 回答
629 浏览

linux-kernel - 内核模块中的警告:预期为“struct rwlock_t *”,但参数的类型为“struct rwlock_t *”

当我使用如下的读写器自旋锁时,我收到一个奇怪的编译器警告,

在交流中定义

通过声明在 bc 中使用

所以,在公元前每当我调用锁定或解锁时,例如。read_rwlock(&rwspinlock) 我收到以下警告。

然后,我更改如下, 在 ac 中定义

宣布在啊

包括在 bc 中,

现在没有编译警告。但是,我不清楚如何!谁能解释一下,到底发生了什么?