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

c# - 调试 dotnet 核心进程挂在 futex

我在以下 linux 嵌入式系统上运行 dotnet core 2.1 应用程序:

该应用程序在 futex 上挂了几天:

我必须在不停止进程的情况下找出哪一行 c# 代码产生了相应的 futex 调用。如何找到返回产生相应 futex 系统调用的 c# 代码行的方法?

/proc/525/maps我发现地址 0x4a6f4 是堆内存的一部分:

但是我怎样才能将这个地址与一行代码联系起来呢?我试图运行gdb -p 525,但我得到了错误

检查 libpthread 库:

我的 .gdbinit 文件:

因此whereorbt在 gdb 中不起作用:

任何想法如何解决这个问题?提前致谢!

0 投票
1 回答
318 浏览

stack - 代码在 1 小时/1 天/30 天后随机挂起

我正在使用带有 ARM 7 内核的 Altera Cyclone V FPGA,我正在运行一个带有 7 线程和互斥锁的应用程序。

应用程序在 1 小时或 1 天或 1 个月后随机挂起,没有定义的时间。

当应用程序运行顺利时,我运行了 strace,它给出了:

应用程序随机挂起,strace 输出如下:

请指出这种行为的原因,以便问题得到解决。

0 投票
1 回答
220 浏览

c++ - WakeByAddressAll 是如何排序的?

这是问题如何 std::atomic<T>::notify_all 排序?

如果我使用WaitOnAddressfutex直接使用,该问题的答案是什么。


从该问题的答案得出的结论是,以下程序不会挂起,并且 C++ 提供了必要的保证,尽管措辞仍然可能引发问题:

现在让我们考虑将这个程序翻译成纯 Windows API,没有 C++20 甚至 C++11:

由于虚假唤醒,我添加了循环。

所以同样的问题在这里。如果在(1)中以相反的顺序观察(2)和(3),则可能由于丢失通知而挂起。WinAPI 是否会阻止这种情况,或者需要明确设置围栏。


这个问题的答案的实际应用是std::atomic<T>::wait在 Windows 平台上由标准库或替代标准库实现。

futex在 Linux 平台实现的上下文中,我也有同样的问题。

0 投票
2 回答
465 浏览

c++ - 如何找到锁定 Linux futex 的 C++ 行?

我有一个用 C++ 编写的大型应用程序的性能问题。该程序仅使用 150% 的 CPU,而服务器是 24 核超线程 EPYC 和其他类似应用程序可以可靠地达到预期的 4800% CPU 负载。iotop显示几乎没有 I/O,这是预期的。

由于该程序显然既不受 I/O 限制也不受 CPU 限制,我检查strace并发现绝大多数跟踪调用都是等待单个futex. 也就是说:程序的 50 个线程中有 48 个似乎锁定了同一个 futex,这很好地解释了为什么 CPU 负载仅勉强超过 100%。

例子:

现在我的问题是:我如何找到有问题的代码?该程序不是死锁,只是速度慢,所以通常的查找死锁的技术不起作用。

0 投票
0 回答
101 浏览

linux - Futex 设计和退避

我正在写一些没有的东西libc,我需要一个互斥锁来同步(我用过#![cfg_attr(not(test), no_std)])。这是我的代码:

代码已经通过了一些基本测试:

但我有点担心我是否做对了:

  • 我用了两个Relaxed内存命令,那些位置可以吗?

  • 我使用指数退避方法,这是正确的选择吗?

0 投票
0 回答
93 浏览

linux - Rocket App在等待futex时挂在linux上

我有一个简单的火箭 0.5.0-dev 应用程序

main.rs

货运.toml

在我的开发机器(cygwin 中的 rustc 1.47.0 (18bf6b4f0 2020-10-07))上,我可以编译运行这个程序,x86_64-pc-windows-gnu 目标没有问题。

我的 CI 为 x86_64-unknown-linux-musl 构建了这个程序,并将其打包到一个容器中。

Dockerfile

但是,一旦我将此图像部署到 OSCP,我就得到了……什么都没有。该程序只是无限期挂起。我将应用程序从容器中复制出来,并尝试在 Linux 服务器(SMP Debian 4.9.30-2 (2017-06-12) x86_64 GNU/Linux)上运行它,结果相同。我跑了 strace 给了我

似乎应用程序在等待 futex 时死锁,我只是不知道为什么(以及为什么它不会在 Windows 上发生)。我已经尝试使用 x86_64-unknown-linux-gnu 进行编译并切换到系统分配器,但均无济于事。

0 投票
0 回答
105 浏览

multithreading - Perl 线程有时会卡住(其中一些正在等待 futex)

我正在尝试运行的多线程 Perl 应用程序遇到问题(在 Redhat 7.4 上使用 Perl 5.10.1)。该问题已通过以下设置重现(设置类似于原始 Perl 应用程序):

有 2 个文件:main.plmodule1.pm

主要.pl

  • 完成一组任务的顶级脚本,调用为“main.pl <NumberOfTestsToRun> <MaxWorkersToUse>”

模块1.pm

  • 支持使用 IPC::Run 模块运行另一个命令(在本例中为 echo)的模块

输出目录结构如下: <pwd>/test_output/Test_<TestNumber>/,每个Test_<TestNumber>目录下都有track.logoutput 两个文件

我面临的问题是,有时某些线程会卡在 IPC::run 命令上(track.log 文件不包含“运行完成”行)。

例如,当我上次执行“main.pl 1000 128”(使用 128 个工作人员进行 1000 次测试)时,许多线程没有完成并且 main.pl 继续运行(等待)。当我运行 strace 时,我得到以下输出:

上面运行的进程树如图所示(一旦所有其他线程都完成了):

我无法理解为什么会发生这种情况(可能与 Threads::Queue 或管道等有关)。如果有人可以帮助我解决这个问题,那就太好了。我终于希望能够在没有任何 futex 等待/挂起问题的情况下运行所有​​测试。我努力了 :

  • 使用 IPC::Run 的超时选项来检查控件是否返回,但这里没有运气。
  • 使用 open3() 代替 IPC::Run :- 与 IPC::Run 相比,问题仍然存在并且更频繁地发生

笔记:

  • 当我使用 Perl 5.16.3 时不会出现这个问题。但是我需要使用 Perl 5.10.1 使原始应用程序工作,因此如果有人可以帮助我理解如何解决这个问题会很棒:)
  • 在 module1::dummy() 中,如果将 $loCmd 更改为“sleep”并且将 $loArgs 更改为(比如说)“10”,那么问题就不会出现(给人的印象是它可能与管道/IO 有关缓冲区)。
  • 卡住的线程数可能因不同的运行而异,有时所有线程都完成而没有任何问题(可能存在竞争条件)。
0 投票
1 回答
146 浏览

c++ - 投原子是否安全到 T

我有两个问题:

  1. 在一般情况下,将原子用作 T 并在它们之间互换是否安全?
  2. 在 futex 的情况下,做演员表是否安全?

我知道对非原子类型执行原子操作是未定义的行为,但我找不到相反的答案。例如,它按预期编译和执行:

至于第二个问题,Linux 手册页在 FUTEX_WAIT 操作中说

futex 字的值的加载是原子内存访问(即,使用相应架构的原子机器指令)。相对于同一 futex 字上的其他 futex 操作,该加载、与期望值的比较以及开始睡眠是原子地且完全有序地执行的。

那么下面的代码安全吗?

0 投票
0 回答
80 浏览

c - 如何为 pid 实现 futex_wait sysccall

我有一个使用 futex_wait 系统调用使线程进入睡眠状态的代码。如何使用 futex_wait 系统调用使进程进入睡眠状态?

我理解这个程序,它创建线程并将它们置于睡眠状态,然后调用 futex_Wake 系统调用来唤醒线程,futex_wake 应该返回它已经唤醒的线程数

示例代码:

我对它很陌生,所以我想了解我应该进行哪些更改才能使用 futex 使进程进入睡眠状态

0 投票
1 回答
35 浏览

c++ - 如何与 WaitOnAddress 比较常量

在 Linux 中,futex 具有以下签名 long futex(uint32_t *uaddr, int futex_op, uint32_t val, const struct timespec *timeout),所以我可以说syscall(SYS_futex, &m_address, FUTEX_WAIT_PRIVATE, 1, nullptr);如果 m_address 的值为 1,哪个会暂停当前线程。

我想知道的是如何在 Windows 中执行此操作。

的签名BOOL WaitOnAddress(volatile VOID *Address, PVOID CompareAddress, SIZE_T AddressSize, DWORD dwMilliseconds)。没有价值的选择。我是否必须创建一个具有常量值的变量并将其传递给 CompareAddress 或者我错过了什么?