asio监听eventfd

2024-02-12 08:52
文章标签 监听 asio eventfd

本文主要是介绍asio监听eventfd,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

c++ - Does BOOST asio supports eventfd? like epoll - Stack Overflow

asio的官方example并没有asio监听eventfd的例子,但asio支持posix::stream_descriptor, 

如果将eventfd包装成posix::stream_descriptor,并注册到io_context里,那就应该支持了。 

例子如下:

#include <array>
#include <iostream>
#include <thread>
#include <asio.hpp>#define handle_error(msg) \do { perror(msg); exit(EXIT_FAILURE); } while (0)void wait_handler(const asio::error_code& error){if (!error){// Wait succeeded.}}uint64_t value{0};
uint64_t total{0};int efd;void read_from_stream(asio::posix::stream_descriptor& stream) {stream.async_wait(asio::posix::stream_descriptor::wait_read,[&stream] (std::error_code ec) {int ret = read(efd, &value, sizeof(uint64_t));if (ret != 8)handle_error("[producer] failed to write eventfd");total += value;std::cout << std::this_thread::get_id() << " read " << value << " total " << total << std::endl;read_from_stream(stream);});
}int main() {auto start = std::chrono::steady_clock::now();std::cout << std::this_thread::get_id() << " main thread" << std::endl;efd = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK);if (efd == -1)handle_error("eventfd");asio::io_context io_context;asio::posix::stream_descriptor stream{io_context, efd};read_from_stream(stream);std::thread thread([fd = efd, &start](){uint64_t one{1};for(uint64_t i = 0; i < 1000; i++){//std::cout << i << " write\n";int ret = write(fd, &one, sizeof(uint64_t));if (ret != 8)handle_error("[producer] failed to write eventfd");// std::this_thread::sleep_for(std::chrono::milliseconds(1));}auto diff = std::chrono::steady_clock::now() - start;std::cout << std::chrono::duration_cast<std::chrono::microseconds>(diff).count() << " \n";std::exit(0);});io_context.run();thread.join();return 0;
}

这篇关于asio监听eventfd的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702199

相关文章

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

Kotlin Compose Button 实现长按监听并实现动画效果(完整代码)

《KotlinComposeButton实现长按监听并实现动画效果(完整代码)》想要实现长按按钮开始录音,松开发送的功能,因此为了实现这些功能就需要自己写一个Button来解决问题,下面小编给大... 目录Button 实现原理1. Surface 的作用(关键)2. InteractionSource3.

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

SpringBoot整合Canal+RabbitMQ监听数据变更详解

《SpringBoot整合Canal+RabbitMQ监听数据变更详解》在现代分布式系统中,实时获取数据库的变更信息是一个常见的需求,本文将介绍SpringBoot如何通过整合Canal和Rabbit... 目录需求步骤环境搭建整合SpringBoot与Canal实现客户端Canal整合RabbitMQSp

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依