Linux eventfd 的初始值和在可轮询锁中的使用



问题

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

int eventfd(unsigned int initval, int flags);

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

Python Lock对象在未阻塞状态下启动。我对eventfd的使用要求初始值为非零。如果该值在内部是uint64_t

对象包含无符号64位整数(uint64_t(计数器,由内核

为什么是unsigned int类型的初始值自变量?

Overt Detail

如果我使用非零值作为Lock解锁状态,则通过写入来完成释放。没有干预获取的多次发布是错误的,需要失败。这要求当事件对象包含非零值时写入应该失败。在默认模式下,事件对象将添加发布到它的值,直到(uint64_t)0xfffffffffffffffe,然后再阻止写调用。为了检测这种情况,我将进行一次非阻塞写入,将值推过这个最大值,从而触发这种情况:

如果添加会导致计数器值超过最大值,则写入(2(任一块直到对文件描述符执行读取(2(或失败如果文件描述符被设置为非阻塞。

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

初始值的类型可能只是出于历史原因。一旦使用了这样的界面,它就会粘在一起,之后很难更改。

如果您需要初始值为UINT64_MAX-1,为什么不使用0参数调用eventfd,然后立即使用UINT64_MAX-1执行write,然后再将文件描述符传播给其他人:

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

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

相关内容

  • 没有找到相关文章

最新更新