问题标签 [futex]

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 投票
0 回答
1352 浏览

c - 为什么 glibc futex 挂了

我已经使用 APUE 中提到的 err_doit 函数编写了一个程序。该程序将使用此函数在无限循环中打印消息量。但它总是在几分钟后运行时挂断。我使用附加此过程的 strace 命令来调试它,下面的消息是打印的。

这是源代码引发的错误,请帮助我,非常感谢。我的程序只有一个线程。

0 投票
1 回答
3609 浏览

c - 在这种情况下 futex 是如何工作的?

我有一个 futex 的示例代码。但我无法理解代码流......

输出是这样的:

这段代码实际上是如何表现的?

thread_f 函数的触发器是什么?

等待和唤醒在这里如何工作?

0 投票
0 回答
276 浏览

c - Futex 如何在我的代码中工作?

我看到我的 futex 代码输出混乱。

这是我的代码,

输出:

这里的问题是,在线程 2 释放 futex 之前,另一个线程正在获取它。(如果您在输出中看到)。

那么为什么会这样呢?当线程 2 使用 futex 时,它是如何分配给线程 4 的?代码中是否有任何缺陷?

0 投票
1 回答
470 浏览

c - 使用基于 futex 的锁管理跟踪服务员的最有效方法是什么?

我一直在对基于 futex 的锁使用等待者计数方法:与 futex 相邻int,有一秒钟int是等待者计数,等待者在执行 futex 等待操作之前竞争锁原子地增加,并在从返回时原子地减少futex 系统调用。但是,我注意到,当运行的线程数大于 cpu 数时,就执行的无用唤醒系统调用的数量而言,这具有病态的不良属性,如下所示:

线程 A 在 futex 上挂起等待,因此等待者计数增加,但它不会很快再次收到时间片,因为所有 cpu 都在使用中。同时,线程 B 正在快速执行临时获取和释放锁的操作。每次,它都会看到有一个等待者,因此会进行 futex 唤醒系统调用,尽管线程 A 已经被发送了一个唤醒并且还没有机会运行并从等待者计数中减少自己。

有什么好办法解决这个问题吗?我觉得应该有一些安全的方法让发送唤醒事件的线程执行相当于减少服务员计数的操作(直接这样做似乎是不可能的,因为很难协商,因此不会发生多次递减)。int如有必要,可以接受向锁定状态添加一个或多个额外字段。

我知道的另一种设计是在服务员计数之前,而在原子锁定int本身上只有一个争用标志。这样做的方式是,解锁操作清除标志,并在发现锁定后尝试(成功与否)获取锁定设置标志。解锁时,如果设置了标志,则执行唤醒操作。我相信这种设计避免了我遇到的问题,但它有一个不同的问题:在低竞争下,在持有锁时到达的服务员将在释放锁时无条件地进行 futex 唤醒系统调用,即使没有其他服务员。也许这种设计可以与服务员数量混合,以消除部分或全部虚假唤醒系统调用?

0 投票
0 回答
410 浏览

linux - 实现同时支持 32 位应用和 64 位应用的互斥锁

众所周知,在 Linux 上的 libpthread 中,互斥锁在 32 位模式和 64 位模式下具有不同的大小。在同一个 Linux 机器上运行的 32 位应用程序和 64 位应用程序之间无法在共享内存中共享互斥锁。(如果我对此有误,请纠正我。)

我们正在尝试在 Linux 中使用 futex 实现我们自己的互斥库,以同时支持 32 位和 64 位应用程序。即,无论库被编译成 32 位还是 64 位,这个互斥体都将具有相同的大小和结构。

此外,我们也想支持“强大的互斥锁”,我们认为这里存在问题。AFAIK,glibc/libpthread 为每个 pthread 创建“robust_list”,并为每个 pthread 互斥体维护 robust_list。这与内核健壮列表功能一起使用,以支持应用程序的健壮互斥锁。

我的问题是:是否可以将我自己的互斥锁附加到由 glibc/libpthread 维护的同一个“robust_list”?如果不是,我是否必须使用不同的健壮列表并将新列表提供给内核?我怀疑如果我推出自己的列表,该应用程序将无法再使用 -pthread。即,我自己的互斥代码将无法与应用程序的 glibc pthread 共存。

任何意见或建议表示赞赏。

谢谢。

0 投票
0 回答
1233 浏览

c++ - CentOS:运行多线程应用程序时自旋锁消耗高 CPU

我正在 Cent-OS 机器上运行一个用 C++ 编写的多线程应用程序。“top”命令输出显示应用程序正在占用大部分 CPU,并且它正在占用系统 CPU(而不是用户 CPU)。然后我想到了运行“perf top”命令,它显示:

我不确定为什么它会占用那么高的系统 CPU。该应用程序在其他具有 Ubuntu OS 的 Linux 机器上运行良好,在我看来它与 CentOS 有关。

应用程序是用 C++ 编写的,在高系统 CPU 时大约有 250 个活动线程。
应用程序确实会进行大量 malloc/free 调用。

操作系统:Linux-2.6.32-358.18.1.el6.x86_64-x86_64-with-centos-6.4-最终
libc版本:2.12
机器内核数:16

0 投票
1 回答
813 浏览

linux - 如何调试此用户空间应用程序崩溃?

我在我的嵌入式 Linux 系统(基于 TI AM335x)上运行 Qt5.4.0 应用程序,它停止运行,我很难调试它。这是一个 QtWebKit QML 示例(youtubeview),但其他 QtWebKit 示例对我来说是相同的,所以它是基于我的系统的 WebKit。

当我运行应用程序时,它会运行一秒钟左右,然后以没有消息结束。也没有向 syslog 或 dmesg 报告任何内容。当我用 strace 启动它时,我可以看到这条 futex 消息:

然后它停止。不是很有帮助......我的下一个想法是用 GDB 调试它,但是当我尝试运行它时 GDB 崩溃:

-sh-4.2# gdb youtubeview
GNU gdb (GDB) 7.5
版权所有 (C) 2012 Free Software Foundation, Inc.
...
(gdb) 运行
启动程序:/usr/share/qt5/examples/webkitqml/youtubeview/youtubeview
/home /mike/ulf_qt_450/ulf/build-ulf/out/work/armv7ahf-vfp-neon-linux-gnueabihf/gdb/7.5-r0.0/gdb-7.5/gdb/utils.c:1081:内部错误:虚拟内存耗尽:无法分配 64652911 字节。
检测到 GDB 内部的问题,

即使我首先在 main 处设置断点也会出现此问题,只要它开始运行它就会卡住并耗尽内存。

  • 是否有其他工具或技术可用于帮助隔离问题?
  • 也许 GDB 的论点是限制内存使用或提供更多关于为什么这个 Qt 程序使它崩溃的信息?
  • 也许我可以使用一些 FD 或系统变量来找出为什么 FUTEX 被持有和失败?

我不确定现在在哪里解决这个问题。

Qt 代码本身非常简单,我预计这里不会出现任何问题:

0 投票
0 回答
4696 浏览

linux - futex 返回 ETIMEDOUT 比参数 timeout 快

我在 vSphere 上的 Ubuntu 虚拟机中工作。我的应用程序每 1 秒等待一个 pthread 信号 (sem_t)。当我 strace 系统调用时,发现系统调用的返回速度比 1 秒快得多。strace 的结果如下。

futex(0x7f4461035200, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 0, {1, 0}, ffffffff) = -1 ETIMEDOUT (连接超时)

有人知道原因吗?

0 投票
1 回答
229 浏览

glib - 为什么 glib 不使用私有 futex?

在调查一些性能问题时,我最终进入了 gthread-posix.c。在那里我找到了如下代码:

我很好奇为什么它在这里和其他地方不使用 FUTEX_WAIT_PRIVATE。至少在 ARM 上,非私有 futex 的速度要慢得多,而且我的印象是 glib 用于多线程而不是共享内存中的进程间通信。

0 投票
1 回答
321 浏览

ios - iOS futex 支持

有没有办法在 iOS 上实现快速自旋锁,当且仅当存在争用时才会恢复阻塞 OS 原语?我正在寻找与这些实现等效的东西:

http://locklessinc.com/articles/keyed_events/(快速互斥) http://locklessinc.com/articles/mutex_cv_futex/

目的是在我们已经确定自旋锁是理想的但我们想要考虑另一个可能较低优先级的线程持有锁的罕见可能性的地方使用它,在这种情况下我们想要阻塞在内核上原始的并且仅在其他线程释放锁时才被唤醒。