- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个异步日志记录框架,其中有多个线程转储数据。我开始玩 Boost asio 因为它提供了一些简单的方法来强制执行序列化和排序。由于我是初学者,我从线程安全(使用 boost::mutex
和 boost:condition_variable
)循环 bounded_buffer (实际上是向量)开始我的设计。
我写了一个简单的小基准来衡量性能。基准测试只是一个单线程记录一百万条消息(将其插入缓冲区),而我的工作线程只会从队列中获取消息以记录到文件/控制台/记录器列表。
(P.S. mutex 和 C.V 的使用是正确的,并且指向消息的指针正在移动,所以从这个角度来看,一切都很好/高效)。
当我将我的实现改为使用 boost::asio::io_service
时并且有一个线程执行 run()
性能确实 boost 了(实际上,它在增加记录的消息数量而不是降低我最初的简单模型中的性能时可以很好地扩展)
以下是我想澄清的几个问题。
boost::asio::io_service
内部实现具有用于处理程序的线程安全队列,是什么使它比我自己最初的简单线程安全队列设计更有效)。请注意,我的设计经过了很好的审查并且没有任何错误(框架代码基于经过验证的示例),有人可以更详细地了解如何io_service
的内部细节吗?实现这一点。 boost::asio
仅用于 i/o 和网络操作,或者我使用它通过线程池执行并发任务(并行)是一种很好的设计方法。是 io_service
object 只是打算用于 i/o 对象(如文档中所写),但我发现它是一种非常有趣的方式,可以帮助我以序列化方式解决并发任务(不仅仅是 i/o 或网络相关)(有时强制使用排序)股)。我是 boost 的新手,真的很好奇为什么基本模型的性能/规模不如我使用 boost asio 时那么好。 io_service
中的线程安全问题会很有趣。处理程序的线程安全队列(我一直认为在某种程度的实现中,他们也必须使用锁和 c.v )。
最佳答案
恐怕我对(1)帮不上忙,但关于其他两个问题:
(2)我发现boost::asio
里面有一些开销非确定性的架构,即数据进入(或发送到 IO 服务对象)之间的延迟可以从几乎即时响应到数百毫秒的数量级变化。我试图将其量化为我试图解决的另一个关于记录和时间戳 RS232 数据的问题的一部分,但没有得到任何确凿的结果或稳定延迟的方法。发现上下文切换组件存在类似问题,我一点也不会感到惊讶。
(3) 至于使用boost::asio
对于异步 I/O 以外的任务,它现在是大多数异步操作的标准工具。我用 boost::asio
定时器一直用于异步进程,并为其他任务生成超时。将多个工作线程添加到池中的能力意味着您也可以为其他异步高负载任务很好地扩展解决方案。我去年写的最简单和最喜欢的类是一个很小的工作线程类,用于 boost::asio
IO 服务(如有错别字,请见谅,这是内存中的转录而不是剪切和粘贴):
class AsioWorker
{
public:
AsioWorker(boost::asio::io_service * service):
m_ioService(service), m_terminate(false), m_serviceThread(NULL)
{
m_serviceThread = new boost::thread( boost::bind( &AsioWorker::Run, this ) )
}
void Run( void )
{
while(!m_terminate)
m_ioService->poll_one();
mySleep(5); // My own macro for cross-platform millisecond sleep
}
~AsioWorker( void )
{
m_terminate = true;
m_serviceThread->join();
}
private:
bool m_terminate;
boost::asio::io_service *m_ioService;
boost::thread *m_serviceThread;
}
new
根据需要,和
delete
一些当你完成它们时。贴一个
std::vector<AsioWorker*> m_workerPool
进入使用
boost::asio
的设备类你可以进一步包装线程池管理的东西。我一直很想根据时间来编写一个智能池自动管理器来适本地增加线程池,但我还没有一个项目需要它。
关于multithreading - boost ASIO IO_SERVICE 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9780817/
使用 asio 库,我想为 asio::serial_port 读/写调用使用超时。 是否可以使用相同的 asio::serial_port asio::io_context 和用于 asio 的相同
对于我正在从事的副业项目应该使用哪种类型的解析器,我有点困惑。我在 asio 文档中找不到答案。 我知道 DNS 可以与 UDP 或 TCP 一起使用,并且通常通过 TCP 发送较大的响应。 asio
在仅从一个线程调用 io_service::run() 的情况下,从不同线程调用 async_write 和 async_read 是否安全?谢谢! 最佳答案 Is it safe to call a
我想知道Boost ASIO 有多受欢迎。它是否被用于任何流行的网络密集型软件中? 最佳答案 用于管理 IBM Blue Gene/Q 的系统软件 super 计算机广泛使用Boost.Asio。
我想使用一个函数来读取套接字端口,并在收到 IP 数据包时交还控制权。 boost::asio::ip::udp::socket 有一个函数接收(或 async_receive),它返回读取了多少字节
我试图调整 Boost 文档中的 SSL 服务器示例 here但我想制作一个应用程序,您可以在其中使用普通 boost::asio::ip::tcp::socket或 SSL 套接字,但我还没有找到将
在查看 boost asio co_spawn 文档 ( https://www.boost.org/doc/libs/1_78_0/doc/html/boost_asio/reference/co_
我正在尝试使用 Boost.ASIO 库,但我找不到如何列出 boost 的可用端口(带有串行端口服务)或套接字(带有网络服务)。 你知道这是否可能吗? 谢谢你。 最佳答案 Boost.Asio 不提
我想使用boost::asio从多个stdout中同时读取stderr和boost::process。但是,我在使用boost::asio时遇到了编译问题,可以重建以下无法编译的最小示例: #incl
提前为一个愚蠢的问题道歉 - 我对这一切都很陌生。 所以我从 here 下载了 asio ,并尝试#include asio.hpp,但出现以下错误; fatal error: boost/confi
我是使用 boost 的项目的一部分作为一个 C++ 库。现在我们要使用 SMTP/POP3/SSL/HTTP/HTTPS。我在 Poco::Net 中检测到几个拟合类和函数 Poco::Net::P
有谁知道有任何实现 Web Sockets 的尝试吗?使用 Boost asio 的 API? 最佳答案 我意识到这是一个旧线程,但想更新以帮助那些寻找答案的人:WebSocket++完全符合要求。
和 asio::thread_pool 有什么区别和一个 asio::io_context谁的run()函数是从多个线程调用的?我可以更换我的 boost::thread_group调用 io_con
我想连接到由目标 IP 地址和端口号指定的服务器套接字。 boost::asio::connect 似乎不允许使用它。我有 ip 目的地作为无符号 int 值。 更新:我能够做到 ba::ip::tc
我在 pc 上有 3 个网络接口(interface),并且想确保当我进行 udp 套接字发送时,它通过特定的网络接口(interface)发送(我有发送数据时使用的 ip 地址)。 这是代码。 ud
我正在使用 ASIO 开发网络应用程序并提到了Chat-Server/Client 我问过类似的问题Here 为了更好地解释,我在这里添加了更多代码: 我的 Cserver Class class C
我已经阅读了 boost asio 引用资料,浏览了教程并查看了一些示例。尽管如此,我还是看不出应该如何拆除套接字: 我应该调用 close() 还是由套接字的析构函数完成? 什么时候应该调用 shu
我认为标题已经说明了大部分内容,但我也有兴趣了解在没有现有解决方案的情况下如何将 DTLS 支持引入 asio 最佳答案 ASIO 本身不支持DTLS 但有一个GitHub 库asio_dtls已向
我正在将 async_read 与 streambuf 一起使用。但是,我想将读取的数据量限制为 4,这样我就可以在进入正文之前正确处理 header 。 我如何使用 async_read 做到这一点
从this example开始,我想用 async_read_until() 替换 async_read()。 所以我查了一下this example ,并查看了如何调用 async_read_unt
我是一名优秀的程序员,十分优秀!