问题标签 [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 投票
1 回答
156 浏览

c - 共享 pthread_cond_broadcast 卡在 futex_wait

我有一个“服务器”进程a和可能的多个“客户端”进程b。服务器创建一个shm_open包含 apthread_mutex_t和 a的共享内存文件 ( ) pthread_cond_t,它用于向客户端广播发生的事情(参见下面的最小示例)。

起初,这可以正常工作,支持任意数量的客户端,但是在等待广播时第一个客户端被杀死(例如使用 CTRL+C)后,服务器有时会卡pthread_cond_broadcastfutex_wait数据库。

为什么?这应该如何正确完成?

在找到有关此问题的一些讨论后,我尝试了使用和不使用互斥锁以及使用和不使用互斥锁。一切都有相同的行为。

要重现的代码:

编译gcc ab.c -o ab -lpthread -lrt,然后运行

在 CTRL+C 和./ab b服务器之间的某个时间将停止输出broadcast.

0 投票
1 回答
457 浏览

c++ - 将 std::atomic 与 futex 系统调用一起使用

在 C++20 中,我们可以在原子变量上休眠,等待它们的值改变。我们通过使用方法来做到这一点std::atomic::wait

不幸的是,虽然wait已经标准化,但wait_forwait_until没有。这意味着我们不能在超时的原子变量上休眠。

无论如何,在 Windows 上使用WaitOnAddress和 Linux 上的futex系统调用在幕后实现了在原子变量上休眠。

解决上述问题(无法在超时的原子变量上休眠),我可以在 Windows 上传递一个std::atomicto的内存地址,WaitOnAddress它会(有点)在没有 UB 的情况下工作,因为函数void*作为参数获取,并且强制转换std::atomic<type>为有效void*

在 Linux 上,是否可以std::atomicfutex. futex获取 auint32_t*或 a int32_t*(取决于您阅读的手册),并且转换std::atomic<u/int>u/int*UB。另一方面,手册说

uaddr 参数指向 futex 字。 在所有平台上,futex 都是四字节整数,必须在四字节边界上对齐。对 futex 执行的操作在 futex_op 参数中指定;val 是一个值,其意义和目的取决于 futex_op。

提示alignas(4) std::atomic<int>应该可行,只要类型的大小为 4 字节且对齐为 4,它是哪种整数类型都没有关系。

此外,我已经看到很多地方实现了这种结合 atomics 和 futexes 的技巧,包括boostTBB

那么以非 UB 方式在具有超时的原子变量上睡眠的最佳方法是什么?我们是否必须使用操作系统原语实现我们自己的原子类才能正确实现它?

(存在混合原子和条件变量等解决方案,但不是最佳的)

0 投票
0 回答
49 浏览

c - C 克隆与 futex 崩溃(地址映射区域的权限错误)

我正在尝试创建 64 个线程,并且我给每个线程 65536 个字节作为堆栈......但是从堆栈的顶部,我需要 64 个字节来存储线程函数参数(前 4 个字节是线程 ID(0 到 63 ),第二个 4 字节是线程消息长度(传递给 ' write()'),从字节 8 开始,它是由sprintf(在线程创建之前 ( clone())) 创建的线程消息。在每个线程进程的顶部,我使用了:

让线程进入睡眠状态,直到我们用以下命令唤醒它:

当线程唤醒时,它使用锁定方法锁定线程写入进程,然后写入其消息,然后解锁锁定的用户空间......

我们要唤醒 15 个线程一个一个地写他们的消息(这就是为什么我使用了 lock !否则,将不会观察到写的顺序)......

我期望发生的结果:

我得到一个错误!!!!

这是我的源代码(完整):

一切似乎都很好!但是因为这些:

我有这个错误!问题是什么 ?!

0 投票
1 回答
66 浏览

linux - gdb 不会在“futex”上中断

我在我的进程上运行 strace 来监控性能,我看到很多这样的调用:

我试图捕捉在 gdb 中执行此调用的位置(就像我对其他系统调用所做的那样)。但是,当我尝试打破 futex gdb 无法识别该符号时:

是否有一些特殊的方法可以中断 futex 调用?

0 投票
0 回答
22 浏览

multithreading - 如何使用 futex 在两个独立程序之间进行同步?

我正在尝试使用futex系统调用来同步两个独立的 c 程序。progA创建多个线程并从每个线程调用futex_test。我试图确保一次只progA运行一个线程futex_test

我的方法,因为我想不出一种方法来初始化这两个程序之间共享的任何全局变量,所以progA创建并写入1(available)共享内存。并且在futex_test从同一内存中调用读取时,写入0(unavailable)并调用FUTEX_WAIT系统调用。完成后,它会写入1共享内存并调用FUTEX_WAKE.

但是,它不起作用。我理解这是一个错误的逻辑。知道如何进行这项工作吗?

注意:我不想对“progA”做任何改变。我只能对futex_test

程序A.c

futex_test.c

输出

0 投票
1 回答
26 浏览

profiling - runtime.futex 在 go 配置文件中占用 50% 到 70% 的时间

作为分析几个 golang 服务的一部分,我们看到所有服务都在 runtime.futex 函数中花费了 55% 到 70% 的时间。

请注意,这些服务涉及使用 goroutines、锁和通道来实现 goroutines 之间的同步和通信。

这是意料之中的吗?我们应该只关心在非“运行时”函数上花费的时间,或者这可能是 goroutines/locks/channels 的错误使用造成的,导致 futex 调用中的这种开销?