- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近在一次代码审查中遇到了困难,在接口(interface)适配器中实现了一个 ASIO UDP 套接字;似乎实现了另一个输入 UDP 套接字,并且假设输入和输出都在同一个线程上。所以,我想知道为什么 ASIO 套接字库不维护静态线程(套接字上下文)并将其用于每个套接字?采用 Proactor 模式时要考虑的动机和权衡是什么?
编辑/附录
在看到一些关于我的问题的评论不清楚后,我根据被告知不遵循 Proactor 模式的类定义添加了这段代码:
class InterfaceAdapter{
public:
typedef std::vector<MsgFragment> MsgPackets;
InterfaceAdapter() :
mySocket(myContext) {}
void sendDataToSystem(const DataStruct& originalData);
private:
asio::io_context myContext;
asio::ip::udp::socket mySocket;
MsgPackets transformData(const DataStruct& originalData);
void sendPackets(const MsgPackets& msgs);
};
显然我需要使用全局范围的 asio::io_context
而不是将其作为私有(private)成员并使用它来默认构造套接字?
最佳答案
你的问题不是很清楚,混合或暗示的东西,我认为这也是你问题的原因:
Boost ASIO 是一种前摄器模式,异步处理程序通常在另一个处理程序(即回调)完成后执行。如果用户选择通过在超过 1 个线程上运行 boost::asio::io_context::run
来选择,则可以同时完成此操作。
Boost ASIO 给了你这种自由,这个库没有任何动机地将自己限制在这种极端情况下是没有意义的。静态或全局变量,即线程也被广泛认为是极端糟糕的风格。
但是你的问题表明你的程序即架构被设计为单线程,并且你编写的代码使用 ASIO 就像使用多线程一样(无论如何在运行时不应该有任何显着的开销),或者你的审阅者还误解了 boost ASIO 语义。如果没有您的代码和具体原因,这仍然很难推测。
您的附录的附录:不,我不必是全局的,我假设评论者的观点是你有自己的 asio::io_context
,你通常不需要,因为你的类似乎只是发送数据包,所以对于它来说,它应该无关紧要地运行在哪个 io_context
上。这就是为什么 boost sockets 和类似的只是采用 a reference 到 io_context
的原因,我自己这样做,例如 RTP class I wrote .在那里你可以看到我只是存储了对整个 RTSP Videostreaming 服务器管理的 io_context
的引用。
但是我担心您的公司/审阅者不会以其他方式使用 boost asio,并且您的适配器可能是第一个使用内部 boost asio 的适配器,但无意泄露此实现细节。然后这取决于你的类是如何使用的:整个程序生命周期通常只有一个实例吗,like this ?然后它可以管理它自己的 io_context
,但我假设您宁愿创建它的多个实例。想象一下 boost tcp 连接,即 socket 创建线程和一切只为它自己,对于服务器拥有的每个 tcp 连接,那将是愚蠢的。
所以解决方案要么也只是在你的构造函数中使用 io_context&
,或者如果想避免提升细节,另一个由你设计的类,它是 InterfaceAdapter 的创建者
每次创建新的接口(interface)适配器时都要保留和重用。然而,如果那不可能,那么你应该真正重构你的整个程序,但那将是平庸者开始使用全局变量的时刻。但是,不要让你的 InterfaceAdapter
或 boost::io_context
全局化,而是像 class my_io_singleton
这样的东西仍然必须给你的InterfaceAdpater,以便更好的一天,您的代码将很容易重构。
更新 2接下来的事情可能会让你再次偏离轨道,所以我建议你只有在阅读了上面的部分并且在你用 boost asio 做了更多的实现之后才阅读它,因为它并不重要也不与你的情况相关:公平地说,有在极少数情况下,boost io_contexts
似乎是单例,I stumbled over myself ,但这只是 asio 内置的舒适功能,有人可能会争辩说最好将其排除在外。但它们可以被忽略。
关于c++ - 如果 Proactor 设计模式在异步 I/O 方面更胜一筹,为什么它在 ASIO 中不是默认的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54798087/
在我的类的方法中,我有: this.background.click(function() { this.terminate(); }); 显然 this.terminate(); 不起作用,
在调试的时候,经常会踩到memcpy和memset的手写汇编实现。这些通常使用流指令(如果可用)、循环展开、对齐优化等来实现……我最近也遇到了这个 'bug' due to memcpy optimi
我正在尝试实现一个计时器,它可用于短(秒)事件或更长(小时等)事件。 理想情况下,它应该在 CPU 关闭期间持续存在,例如,电池没电了。如果我使用 System.currentTimeMillis()
我正在使用 apache 基准测试工具在 PHP 和 Node.js 上分别在端口 80 和端口 8000 上运行基准测试。下面的 Node 基准测试命令,在 PHP 上运行测试时换出端口: ab -
我是一名优秀的程序员,十分优秀!