如何用异步库实现忙信号
How to implement busy signal with async library?
我正在使用Boost.Asio,但这个问题应该涵盖任何异步框架。
我有一个通过网络发送和接收数据的类。我想给我的用户提供读写方法和is_busy(),让他们检查数据何时可用。现在,我让write方法的完成处理程序启动一个后台线程,该线程读取并返回到一个future,而read()方法则从该future读取。当返回数据时,write方法将bool设置为true,read线程将其设置为false。
有更好的方法吗?如果我使用Asio正确理解它,我需要完成处理程序,但没有办法告诉我的用户数据还没有到达而不被阻止。
更新
代码示例:
void Socket::write(const vector<byte> input) {
busy_ = true;
read_buffer_.clear();
socket_->async_write_some(asio::buffer(input), [&](const std::error_code ec, const size_t length) {
if (ec && ec != asio::error::operation_aborted) {
throw std::system_error(ec);
}
if (ec == asio::error::operation_aborted) {
return;
}
read_f = std::async(std::launch::async, [&]() {
socket_->async_read_some(asio::null_buffers(), [&](const std::error_code ec, const size_t length) {
if (ec && ec != asio::error::operation_aborted) {
throw std::system_error(ec);
}
if (ec == asio::error::operation_aborted) {
return;
}
read_buffer_.resize(socket_->available());
socket_->read_some(asio::buffer(read_buffer_));
busy_ = false;
});
unsigned long a = service_.run();
service_.reset();
busy_ = false;
return a;
});
});
我通过使用asio::socket_base::bytes_readable
来检查套接字中是否有数据可供读取,并且如果字节数为0,我只会休眠一定数量的微秒。
相关文章:
- 在C 中实现信号模板
- 使用 Qt5 的新信号/插槽实现向滑块发出信号
- 在使用 pthread 和信号量实现生产者-消费者问题时需要帮助
- 实现信号量
- 如何用异步库实现忙信号
- 想要实现将功能类型作为参数的信号模板之类的启动
- 实现信号量时混淆了核心转储
- 使用互斥锁和信号量实现屏障
- 如何在多核系统上实现信号量
- Qt:LNK2001和LNK2019 跨源文件实现信号/时隙后会出现错误
- 使用 Qt 信号和插槽实现 c++ 回调
- 用C++实现一个二进制信号量类
- 使用x86程序集的信号量实现
- c++定时器实现-将一个成员函数分配给信号回调函数指针
- C ++自己实现信号量
- 是否存在具有基本反射的轻量级信号槽实现
- Qt:如何为所有小部件和小部件类型实现通用基类信号/插槽功能(通过虚拟基类插槽)
- 我能否仅使用事件、互斥体和信号量实现公平"wait on multiple events"?
- 创建一个类的多个实现,一个用于发送Qt信号,另一个用于直接使用硬件
- 当实现mouseDoubleClickEvent时,不会发出itemdoubleclick信号