问题
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(或失败如果文件描述符被设置为非阻塞。
如果我理解正确,你想让这个野兽的状态在0
和UINT64_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));
(好吧,你会添加错误检查代码,不是吗(