首页 > 其他分享 > eventfd

eventfd

时间:2023-06-17 15:47:11浏览次数:32  
标签:uint64 eventfd list write sizeof efd

uint64_t u1,u2,u3;
// 写 eventfd,内部 buffer 必须是 8 字节大小;
// 写 3 次
write(efd, &u1 , sizeof(uint64_t))   /* u = 1 */
write(efd, &u2 , sizeof(uint64_t))   /* u = 2 */
write(efd, &u2 , sizeof(uint64_t))   /* u = 3 */
// 读 eventfd
n = read(efd, &u, sizeof(uint64_t));

读到的值是 6(因为 1+2+3)

使用eventfd实现一个消费者和多个生产者:
生产者:是多个线程,会把请求投递到一个 list 中,然后唤醒生产者。

producer:
    // 投递请求到链表
    list_add( global_list, request )
    // 唤醒消费者处理
    write(eventfd, &cnt /* 1 */ , 8)

消费者:是一个线程,后台 loop 处理。使用 epoll 监听 eventfd 的可读事件,这样能做到一旦有请求入队,消费者就立马唤醒处理。

consumer 
    // 添加 eventfd 到监听池
    epoll_ctl(ep, EPOLL_CTL_ADD, eventfd, &ee);

loop:
    // 等待唤醒
    epoll_wait(ep, ... );
    
    // 读取新添加到列表里的元素个数,并且进行处理;
    n = read(eventfd, ... )
    // 遍历链表处理
    for each global_list:
        // do something

标签:uint64,eventfd,list,write,sizeof,efd
From: https://www.cnblogs.com/codingbigdog/p/17487525.html

相关文章

  • eventfd
    参考:https://zhuanlan.zhihu.com/p/393748176inteventfd(unsignedintinitval,intflags);:对eventfd创建的文件描述符进行write和readuint64_tu1,u2,u3;//写eventfd,内部buffer必须是8字节大小;//写3次write(efd,&u1,sizeof(uint64_t))//u=1write(efd,......