问题标签 [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 回答
218 浏览

c - 在不分配给变量的情况下在内核中调用非空函数是否安全

我正在尝试调试内核代码,因为“原子调度”使我的系统崩溃。在实际内核模块的某个点上,我添加了一行来调用另一个内核模块中定义的函数(这个是我制作的)。电话是:

并且mycallback()函数返回int。所以我有两个问题:

  1. 在内核内部调用非 void 函数而不将其结果分配给变量是否安全?

  2. 如果mycallback()调用的代码是 spin_locked 或类似的,它会安全吗?它会是 spin_locked/atomic 还是我可能会睡觉并危及内核?

0 投票
2 回答
1015 浏览

c - 有什么简单的方法可以提高这个自旋锁功能的性能吗?

我正在尝试在我的代码中实现自旋锁,但我基于 Wikipedia 实现的自旋锁导致性能极慢。

有什么方法可以改进它以使其更快吗?

谢谢。

0 投票
5 回答
13032 浏览

c++ - 最快的内联组装自旋锁

我正在用 c++ 编写一个多线程应用程序,其中性能至关重要。在线程之间复制小型结构时,我需要使用大量锁定,为此我选择使用自旋锁。

我对此进行了一些研究和速度测试,我发现大多数实现大致同样快:

  • Microsoft 的 CRITICAL_SECTION,SpinCount 设置为 1000,得分约 140 个时间单位
  • 使用 Microsoft 的 InterlockedCompareExchange实现此算法的得分约为 95 个时间单位
  • 我还尝试使用一些内联汇编来__asm {}使用类似此代码的内容,它的得分约为 70 个时间单位,但我不确定是否已创建适当的内存屏障。

编辑:这里给出的时间是 2 个线程锁定和解锁自旋锁 1,000,000 次所需的时间。

我知道这并没有太大的区别,但是由于自旋锁是一个被大量使用的对象,人们会认为程序员会同意最快的方法来制作自旋锁。然而,谷歌搜索它会导致许多不同的方法。如果使用内联汇编并使用指令而不是比较 32 位寄存器来实现,我认为上述方法将是最快的。此外,必须考虑内存屏障,这可以通过 LOCK CMPXHG8B (我认为?)来完成,它保证了内核之间共享内存的“独占权”。最后[有人建议]对于繁忙的等待应该伴随着 NOP:REPCMPXCHG8B这将使超线程处理器能够切换到另一个线程,但我不确定这是否属实?

从我对不同自旋锁的性能测试来看,没有太大区别,但出于纯粹的学术目的,我想知道哪一个最快。但是,由于我在汇编语言和内存屏障方面的经验非常有限,如果有人可以为我提供的最后一个示例编写汇编代码,我会很高兴,并在以下模板中提供了 LOCK CMPXCHG8B 和适当的内存屏障:

0 投票
1 回答
3860 浏览

c - 如果需要调用 copy_to_user,如何使用自旋锁?

我编写了一个小驱动程序来读取一些数据并将其提供给用户。我的驱动程序可以被多个应用程序使用,即它是一个可重入驱动程序,因此使用自旋锁。但我发现不copy_to_user应该在持有自旋锁的情况下调用它。char_device_buf以下代码中是共享数据;我必须保护它。除了互斥锁之外,还有什么机制可以使用自旋锁和使用copy_to_user吗?

0 投票
1 回答
404 浏览

c - C中的组合信号量和自旋锁?

是否可以在 C 中构建一种组合的信号量/自旋锁?

也就是说,我想要一个支持的线程控制结构:

  • 定期唤醒线程以检查某些变量的状态。(像自旋锁)
  • 如果结构的状态被另一个线程(如 sem_wait/sem_post)更改,则自动提前唤醒线程。

例如在这样的程序中:

家长:

孩子:

如果孩子未能在 5 秒内设置 parent_sem,我希望父母解除阻塞,但如果孩子提前设置了 parent_sem,我也希望在 5 秒过去之前解除阻塞,同时最大限度地减少检查和重新检查状态所花费的 CPU 周期数在这 5 秒内的 parent_sem。我知道我可以使用自旋锁来做到这一点,但是将等待时间设置为高(即 1 秒)意味着大部分时间浪费了将近 1 秒。将其设置为低(例如 100 毫秒)意味着在孩子超时的情况下进行 50 次检查。这些都不是一个好的解决方案。

0 投票
1 回答
2119 浏览

c++ - 排队自旋锁

我碰巧偶然发现了 Queued Spinlock 并想用 C++ 实现。我在谷歌上搜索了一些信息,但无法获得适当的文档。

任何文档/实施提示将不胜感激。

提前致谢

我对迈克尔布朗指出的代码有以下疑问

这个实现是否正确?我怀疑是这样!

0 投票
1 回答
1056 浏览

parallel-processing - 锁定 MCS 算法

我想在 C++ 中为我的一个应用程序实现排队锁定。我正在研究以下论文中的算法: http ://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCUQFjAA&url=http%3A%2F%2Fwww .cs.rice.edu%2F~johnmc%2Fpapers%2Ftocs91.pdf&ei=HpRfUKCZFsfWrQfpgIGACQ&usg=AFQjCNF_QamPWhJrq5dSjJjFjO7W3WzJ5Q&sig2=3TU1vo_aAYbM2fmLxeiZ0A

A & B 正在访问同一个变量(前任->下一个 & I->下一个)以及 C & D(锁定变量),但它们在访问之前没有被锁定。我在这里错过了什么吗?

0 投票
1 回答
3865 浏览

linux - Linux 中的 raw_spin_lock 是否禁用 hrtimer 中断?

在一个处理器上,在同一个线程中,首先调用 raw_spin_lock(),然后它启动一个 hrtimer 并再次返回 raw_spin_lock(),它将在那里旋转。在 hrtimer 中断处理函数中,会调用 raw_spin_unlock()。

这会导致死锁吗?在 raw_spin_lock() 上旋转会禁用中断吗?

0 投票
1 回答
292 浏览

multithreading - pthread_cond_timedwait 中的秒数溢出

我有一个用例,我想获取一个条件变量并在一段时间后释放它(例如:我有一个按时间排序的事件队列,我想阻塞指定的持续时间。)

我遇到了以下内容,这正是我的目的。

但问题是 timespec.sec 是 time_t (这是一个 32 有符号类型)并且它溢出。有解决方法吗?是否有任何其他可用的构造,我们将阻止更长的时间?我正在使用 Linux 平台。

0 投票
1 回答
2897 浏览

linux - 用户空间进程和中断上下文代码之间的同步

最近我参加了几次采访。在提出的所有内核问题中,有一个具体问题我找不到令人信服的答案。

在用户空间进程和中断上下文函数之间共享数据时,您将如何使用不同的同步技术?我令人信服的答案是:

在中断上下文代码中:

那么这不是令人信服的答案。在所有数据访问的情况下,irqsave我都必须这样做吗?irqrestore