问题标签 [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++ - Linux 3.0:futex-lock 死锁错误?
Linux 3.0 提供了一个名为futex的系统调用,许多并发实用程序都基于该调用,包括最近的 pthread_mutex 实现。每当您编写代码时,您都应该始终考虑使用现有实现还是自己编写代码是您项目的更好选择。
上面是一个基于 futex 和man futex(7)中的语义描述的 Lock (mutex, 1 permit count semaphore) 的实现
它似乎包含一个死锁错误,即在多个线程尝试锁定和解锁它几千次之后,线程可以进入 x == -1 并且所有线程都卡在 CompareWait 中的状态,但是没有人持有锁。
任何人都可以看到错误在哪里?
更新:我有点惊讶 futex(7)/semantics 如此糟糕。我完全重写了 Lock 如下......现在正确吗?
这里的想法是 x 具有以下三种状态:
c++ - strace 可以阻止程序的正确执行吗?
我想知道 strace 是否会导致它正在跟踪的程序出现异常。目前,我正在尝试跟踪一个随机分段错误错误(但当我使用 strace 时,程序似乎永远不会以这种方式崩溃),这是在我调用pthread_cond_wait()
.
当我直接运行我的程序时——它实际上是 c/c++ 的混合体,它有时会按预期工作,但如前所述,有时它会崩溃pthread_cond_wait()
(顺便说一句,如果有人想帮助我解决这个问题,请参阅此处,任何帮助将不胜感激)。
如果我直接运行我的程序并将 strace 附加到这样的进程:
输出是单行的,它说它正在等待一个 futex(实际上像这样:)
如果我像这样从 strace 运行我的程序:
然后在我的文件输出的某个时刻,准确地说,当我调用 时pthread_cond_wait()
,它会不断发送类似这样的多行垃圾邮件(并且每次futex()
调用等待的值都比以前高,这里是 15)
我还尝试将 strace 作为一个孩子而不是该过程的父母来运行(希望它会有所作为)。即使我试图捕捉那个随机分段错误错误,它也从未出现/发生过。
现在我的问题是这是否常见和故意,或者我的 strace-call 是否是虚假的。如果没有,是否有任何系统调用我需要注意,因为它们可能不适用于 strace,或者这种奇怪的行为是否涉及一组系统调用?有没有办法解决?
我正在使用 debian-squeeze,如果这可能相关的话。
更新 1
我完全忘了提到我正在运行多个线程(POSIX 线程)和几个孩子。虽然不pthread_cond_wait()
应该遇到任何比赛,因为它绝对是 a 之后的第一个调用,pthread_mutex_lock()
它访问pthread_cond_t
和pthread_mutex_t
我正在解析为参数。但我不知道里面是否pthread_cond_wait()
可能有任何竞争条件。如有必要,我将提供程序代码。
c++ - 通过 popen() 执行的命令随机挂起
我的程序有这个奇怪的问题:
它尝试通过管道读取某些命令的输出来查找设备:
然后使用fgets()读取文件流并使用pclose()关闭管道。
在单线程程序中它运行良好。但是,当我把它集成到一个多线程程序中后,fgets()函数开始随机阻塞线程。
检查后,我发现fgets()阻塞,因为有时fp作为空文件流返回。在我将fp的状态设置为非阻塞并使用read()通过其 ID 读取文件后,我可以看到read()由于文件流为空而返回 -1,然后pclose()挂起。所有这些都是随机发生的。
所以我认为在这种情况下,通过 popen() 执行的命令会挂起并且永远不会终止。但为什么它随机发生?多线程程序只有另一个线程用于用户界面交互。我认为这很好,因为管道仅在本地使用。
任何想法表示赞赏。谢谢!
更新
strace 显示有时子进程在一堆 munmap() 调用之后调用 futex() 然后挂在那里: futex(0xb72eaf00, FUTEX_WAIT_PRIVATE, 2, NULL
在正常情况下,不会调用 futex。
作为参考,主进程中 strace 的输出:
子进程 shell 的 strace 输出:
c - C - 程序冻结;futex_wait_queue_me
根据要求,我已将代码全部包含在内,以便您对其进行测试。请记住,这还远未完成,但应该能够通过稳定的 tcp 连接发送和接收数据包。
当我运行它时,我得到:
然后它就挂了。我也使用了 strace ,这给了我(只包括它停止的最后一点):
并且系统监视器说程序正在休眠,并给出 futex_wait_queue_me。
这可能是由于某处的内存泄漏导致对 futex 的调用过多吗?
linux - Berkeley DB:由于先前在 c api 调用期间异常退出而卡在 futex_wait
我正在用 C 语言编程,在内核 2.6.18-238_xen_AMD64 的 RHEL5.6 上使用 berkeley db 4.3 (/usr/lib64/libdb-4.3.so)。
在我的测试中(写入 1,000,000 个键/值对),如果一个进程异常退出(ctrl + c、kill 或 assert 失败),而对 db 的操作正在进行中,则该 db 上的后续操作将在打开时被阻止。Strace 显示进程在打开 __db.00x(eg __db.001, __db.002, __db.003) 文件后停留在 futex(ptr_to_something, FUTEX_WAIT, 2, NULL) 调用。
我知道清除锁定的唯一方法是删除 __db.00x 文件,以下测试表明数据库没有损坏。它符合我的要求,但我只是想知道是否有更好(或更优雅)的方法来解决这个问题。
在这里,我列出了一些 strace stderr 和操作数据库的代码,这可能会有所帮助。
一些 strace 标准错误
操作数据库的代码
linux - 为什么 sem_t 在 64 位 linux 中是 32 字节?
64 位 linux 中的 sem_t 是 32 字节,但是使用 futex 实现,8 字节就足够了(glibc sem_post),是真的吗?如果是真的,为什么要浪费字节?
实际上,我想使用仅使用 8 字节的自定义信号量实现,因此可以使用一个信号量到一个日期条目。但我不太确定 glibc 实现中的其他字节只是填充。
只是为了我的建议,我不会在工作中使用自定义信号量。
linux - 竞争 futex 时系统 CPU 使用率高
我观察到,当 linux futexes 竞争时,系统会在自旋锁上花费大量时间。我注意到这是一个问题,即使不直接使用 futex,但在调用 malloc/free、rand、glib 互斥调用和其他调用 futex 的系统/库调用时也是如此。有没有办法摆脱这种行为?
我正在使用带有内核 2.6.32-279.9.1.el6.x86_64 的 CentOS 6.3。我还尝试了直接从 kernel.org 下载的最新稳定内核 3.6.6。
最初,问题发生在具有 16GB RAM 的 24 核服务器上。该进程有 700 个线程。使用“perf record”收集的数据表明,自旋锁是从 __lll_lock_wait_private 和 __lll_unlock_wake_private 调用的 futex 调用的,并且正在消耗 50% 的 CPU 时间。当我使用 gdb 停止该进程时,回溯显示对 __lll_lock_wait_private __lll_unlock_wake_private 的调用是由 malloc 和 free 进行的。
我试图减少这个问题,所以我编写了一个简单的程序,表明确实是 futexes 导致了自旋锁问题。
启动 8 个线程,每个线程执行以下操作:
我在一台 8 核机器上运行它,它有足够的 RAM。
使用“top”,我观察到机器空闲 10%,用户模式 10%,系统模式 90%。
使用“perf top”,我观察到以下内容:
我希望这段代码在自旋锁中花费一些时间,因为 futex 代码必须获取 futex 等待队列。我还希望代码在系统中花费一些时间,因为在这段代码中,用户空间中运行的代码非常少。然而,50% 的时间花在自旋锁上似乎是多余的,尤其是当这个 cpu 时间需要做其他有用的工作时。
python - 不使用幕后线程的 Python ssh 库?
我们在混合线程和分叉时遇到问题,这与这篇博客文章中描述的基本相同:http ://rachelbythebay.com/w/2011/06/07/forked/
(混合线程和分叉导致一些子进程挂在 FUTEX 调用上)
她的分析基本上是他们的 SSH 库正在创建各种线程,她得出的结论是他们不需要使用 ssh
我们需要 ssh,有人知道不产生线程的 python ssh 库吗?
c - 为什么 futex 在唤醒线程时比互斥锁花费更长的时间?
我试图测量线程调用唤醒睡眠线程时的延迟。既然有人说许多同步指令是在 futex 之上开发的,我希望 futex 总是更快。但是,我的测试给出了相反的结果。我想知道我是否做错了什么,或者这实际上是一个事实。
这是我的测试的详细信息:
- 进程已被设置为与特定核心的亲和性
- 时间与 RDTSC() 指令返回的数字进行比较
- 创建了2个线程,其中唤醒线程2具有更高的FIFO优先级
Thread1 通过解锁互斥锁来发送信号,因此 Thread2 应该在下一个计划中唤醒。thread1 上的 sleep(1) 是为了确保 thread2 在调用 mutex_unlock 时休眠等待互斥锁。
通过用 futex 系统调用替换 mutex 来完成类似的测试:
mutx 和 futx 都被声明为全局的。在我的 Core i7 930 机器上,使用 fedora17,mutex 的唤醒速度始终比 futex 快 5-10%。测试应用程序由 gcc 4.7 在默认设置下编译。有什么建议吗?提前致谢。
linux - 适用于 64 位的 Linux futex
我在 64 位 Linux 机器上:
Linux illin793 2.6.32-279.5.2.el6.x86_64 #1 SMP 2012 年 8 月 14 日星期二 11:36:39 EDT x86_64 x86_64 x86_64 GNU/Linux
来自 man futex:
int futex(int *uaddr, int op, int val, const struct timespec *timeout, int *uaddr2, int val3);
因此,这里 futex 使用 32 位值。
Linux 上是否有适用于 64 位值的 futex?