gpt4 book ai didi

c++ - Boost ASIO 阻塞回调

转载 作者:搜寻专家 更新时间:2023-10-31 01:31:32 25 4
gpt4 key购买 nike

从 asio 到 block 的回调是否安全(或合理)?

void Connection::start() {
/* Assume std::string buffer; that has data to write. */
auto callbackFn = boost::bind(&Connection::callback, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred);

boost::asio::async_write(_socket, boost::asio::buffer(buffer), callBackFn);
}

void Connection::callback(const boost::system::error_code& error,
std::size_t bytesSent) {
/* Perform long running action with bytes sent */
boost::asio::async_write(...);
}

或者我应该在回调中生成一个线程,然后立即返回并在该线程完成后执行操作?

最佳答案

是的,在很多场景下都是合理的。但作为架构师,您有责任决定它在您的场景中是否真的合理。

一般来说,您的io_service 将在一个线程上运行,即调用回调的线程,这意味着它在调用回调时不处理消息。如果没问题,那么你就可以开始了。 (请注意,这里出现了“安全”部分——您是否正确保护了您的对象以便跨线程使用?)

如果不行,则应将消息发送到另一个线程进行处理。

至于我和我家,我们更喜欢主动对象模式来保持 IO 服务的响应性和多线程的担忧最小化。在 Effective Concurrency 上查看 Herb Sutter 的文章系列.具体来说,您应该阅读:

PS,如果可能的话,放弃 boost::bind() 以支持 C++11/14 lambdas。


更新:至于为什么更喜欢 lambda,答案归结为清晰度和可维护性(性能为 about the same,lambda 略有优势)。一旦您习惯了捕获的 lambda 语法等等,它就会自然得多。 Bind 需要“由内而外”地阅读它,从不自然地进行心理解析,并且对于成员函数和捕获引用来说更加乏味。考虑(改编自 Boost docs ):

struct S
{
void foo( int&, double ) const;
} s;

// ...
auto x = 0;
auto binder = bind( &S::foo, s, ref(x), placeholder::_1 ); // s.foo(x-as-ref, _1)
auto lambda = [&]( auto d ) { s.foo( x, d ); };

auto d = 42.0;
binder( d );
lambda( d );

底部的调用语法相同,但 lambda 定义对于实际发生的事情更加清晰。 Lambdas 也很容易扩展为多个语句,而 bind 则不然。

关于c++ - Boost ASIO 阻塞回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45642844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com