问题标签 [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.
c# - 调试 dotnet 核心进程挂在 futex
我在以下 linux 嵌入式系统上运行 dotnet core 2.1 应用程序:
该应用程序在 futex 上挂了几天:
我必须在不停止进程的情况下找出哪一行 c# 代码产生了相应的 futex 调用。如何找到返回产生相应 futex 系统调用的 c# 代码行的方法?
/proc/525/maps
我发现地址 0x4a6f4 是堆内存的一部分:
但是我怎样才能将这个地址与一行代码联系起来呢?我试图运行gdb -p 525
,但我得到了错误
检查 libpthread 库:
我的 .gdbinit 文件:
因此where
orbt
在 gdb 中不起作用:
任何想法如何解决这个问题?提前致谢!
stack - 代码在 1 小时/1 天/30 天后随机挂起
我正在使用带有 ARM 7 内核的 Altera Cyclone V FPGA,我正在运行一个带有 7 线程和互斥锁的应用程序。
应用程序在 1 小时或 1 天或 1 个月后随机挂起,没有定义的时间。
当应用程序运行顺利时,我运行了 strace,它给出了:
应用程序随机挂起,strace 输出如下:
请指出这种行为的原因,以便问题得到解决。
c++ - WakeByAddressAll 是如何排序的?
这是问题如何 std::atomic<T>::notify_all 排序?
如果我使用WaitOnAddress
或futex
直接使用,该问题的答案是什么。
从该问题的答案得出的结论是,以下程序不会挂起,并且 C++ 提供了必要的保证,尽管措辞仍然可能引发问题:
现在让我们考虑将这个程序翻译成纯 Windows API,没有 C++20 甚至 C++11:
由于虚假唤醒,我添加了循环。
所以同样的问题在这里。如果在(1)中以相反的顺序观察(2)和(3),则可能由于丢失通知而挂起。WinAPI 是否会阻止这种情况,或者需要明确设置围栏。
这个问题的答案的实际应用是std::atomic<T>::wait
在 Windows 平台上由标准库或替代标准库实现。
futex
在 Linux 平台实现的上下文中,我也有同样的问题。
c++ - 如何找到锁定 Linux futex 的 C++ 行?
我有一个用 C++ 编写的大型应用程序的性能问题。该程序仅使用 150% 的 CPU,而服务器是 24 核超线程 EPYC 和其他类似应用程序可以可靠地达到预期的 4800% CPU 负载。iotop
显示几乎没有 I/O,这是预期的。
由于该程序显然既不受 I/O 限制也不受 CPU 限制,我检查strace
并发现绝大多数跟踪调用都是等待单个futex
. 也就是说:程序的 50 个线程中有 48 个似乎锁定了同一个 futex,这很好地解释了为什么 CPU 负载仅勉强超过 100%。
例子:
现在我的问题是:我如何找到有问题的代码?该程序不是死锁,只是速度慢,所以通常的查找死锁的技术不起作用。
linux - Futex 设计和退避
我正在写一些没有的东西libc
,我需要一个互斥锁来同步(我用过#![cfg_attr(not(test), no_std)]
)。这是我的代码:
代码已经通过了一些基本测试:
但我有点担心我是否做对了:
我用了两个
Relaxed
内存命令,那些位置可以吗?我使用指数退避方法,这是正确的选择吗?
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 进行编译并切换到系统分配器,但均无济于事。
multithreading - Perl 线程有时会卡住(其中一些正在等待 futex)
我正在尝试运行的多线程 Perl 应用程序遇到问题(在 Redhat 7.4 上使用 Perl 5.10.1)。该问题已通过以下设置重现(设置类似于原始 Perl 应用程序):
有 2 个文件:main.pl,module1.pm。
主要.pl:
- 完成一组任务的顶级脚本,调用为“main.pl <NumberOfTestsToRun> <MaxWorkersToUse>”
模块1.pm:
- 支持使用 IPC::Run 模块运行另一个命令(在本例中为 echo)的模块
输出目录结构如下: <pwd>/test_output/Test_<TestNumber>/,每个Test_<TestNumber>目录下都有track.log和output 两个文件
我面临的问题是,有时某些线程会卡在 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 有关缓冲区)。
- 卡住的线程数可能因不同的运行而异,有时所有线程都完成而没有任何问题(可能存在竞争条件)。
c++ - 投原子是否安全到 T
我有两个问题:
- 在一般情况下,将原子用作 T 并在它们之间互换是否安全?
- 在 futex 的情况下,做演员表是否安全?
我知道对非原子类型执行原子操作是未定义的行为,但我找不到相反的答案。例如,它按预期编译和执行:
至于第二个问题,Linux 手册页在 FUTEX_WAIT 操作中说
futex 字的值的加载是原子内存访问(即,使用相应架构的原子机器指令)。相对于同一 futex 字上的其他 futex 操作,该加载、与期望值的比较以及开始睡眠是原子地且完全有序地执行的。
那么下面的代码安全吗?
c - 如何为 pid 实现 futex_wait sysccall
我有一个使用 futex_wait 系统调用使线程进入睡眠状态的代码。如何使用 futex_wait 系统调用使进程进入睡眠状态?
我理解这个程序,它创建线程并将它们置于睡眠状态,然后调用 futex_Wake 系统调用来唤醒线程,futex_wake 应该返回它已经唤醒的线程数
示例代码:
我对它很陌生,所以我想了解我应该进行哪些更改才能使用 futex 使进程进入睡眠状态
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 或者我错过了什么?