我有一个使用io_service和多个线程的程序。在Ubuntu 11.04上升压:: asio :: strand断了(boost_all_dev 1.42)
它实例化一些套接字对象。这些对象每个都有一个同步链。所有对async_read(),async_write()和类似函数的调用都会经过strand_.wrap(boost :: bind(...))。每个对象还具有被初始化为0。
内这些功能之一(接通数据接收回调)一个int interlock_变量,i执行以下操作:
Class::startRead(...)
{
...
boost::asio::async_read(socket_, boost::asio::buffer(ptr, 16384), boost::asio::transfer_at_least(1),
strand_.wrap(boost::bind(&EagerConnection::on_read, this, placeholders::error, placeholders::bytes_transferred)));
}
Class::on_read(...)
{
...
startRead();
assert(0 == __sync_fetch_and_add(&interlock_, 1));
onData_();
assert(1 == __sync_fetch_and_add(&interlock_, -1));
}
因为一切是通过同步那首先声称绝不应该开火的那股。但是,它确实发射了!当我检查GDB中的值时,interlock_的结束值是2,这意味着两个单独的on_read()调用同时处于活动状态。
这是否意味着boost :: asio :: strand被破坏? (我已经检查过在完成函数中没有任何重新进入 - onData_信号处理程序不会重新调用on_data())。
“early”startRead是否可以导致立即重新进入? (无论async_x和链的语义似乎表明它不能)
如果你真的想看到的类的完整的上下文,它可以作为一个要点:https://gist.github.com/979212
感谢您的企图!这可能是因为我使用的安装(10.04 LTS)有一些bug在更高版本中修复。请注意,我几乎坚持这个版本,但。 – 2011-06-21 04:56:14