gpt4 book ai didi

python - Linux eventfd 的初始值和在 pollable Lock 中的使用

转载 作者:太空狗 更新时间:2023-10-29 12:37:26 26 4
gpt4 key购买 nike

问题

eventfd()是自 2.6.22 以来 Linux 中可用的新系统调用。调用签名是

int eventfd(unsigned int initval, int flags);

我正在利用这个调用来构建新光剑 Lock可在轮询循环中使用的类。

Python Lock对象以未阻塞状态开始。我对 eventfd 的使用要求初始值不为零。如果该值在内部是一个 uint64_t

The object contains an unsigned 64-bit integer (uint64_t) counter that is maintained by the kernel.

为什么初始值参数的类型是unsigned int

明显的细节

如果我使用非零值作为 Lockunlocked 状态,则通过写入完成释放。没有干预获取的多个版本是错误的并且需要失败。这要求当事件对象包含非零值时写入应该失败。在其默认模式下,事件对象会将发送给它的值添加到 (uint64_t)0xfffffffffffffffe,然后阻止写入调用。为了检测这种情况,我将进行非阻塞写入,将值推到触发这种情况的最大值之上:

If the addition would cause the counter's value to exceed the maximum, then the write(2) either blocks until a read(2) is performed on the file descriptor, or fails with the error EAGAIN if the file descriptor has been made non‐ blocking.

最佳答案

如果我没理解错的话,你想让这个野兽的状态在 0UINT64_MAX-1 之间交替?

初始值的类型可能只是出于历史原因。一旦使用这样的接口(interface),它就会固定下来,之后很难更改。

如果您需要初始值为 UINT64_MAX-1,为什么不使用 0 参数调用 eventfd 并执行 在将文件描述符传播给其他任何人之前,立即用 UINT64_MAX-1 写入:

int ev = eventfd(0, 0);
write(ev, &(uint64_t const){ UINT64_MAX-1 }, sizeof(uint64_t));

(好吧,你会添加错误检查代码,不是吗)

关于python - Linux eventfd 的初始值和在 pollable Lock 中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7453063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com