Don't perform a speculative read when an out-of-band read is pending.
diff --git a/asio/include/asio/detail/dev_poll_reactor.hpp b/asio/include/asio/detail/dev_poll_reactor.hpp
index bea199c..1367b71 100644
--- a/asio/include/asio/detail/dev_poll_reactor.hpp
+++ b/asio/include/asio/detail/dev_poll_reactor.hpp
@@ -125,18 +125,20 @@
 
     if (allow_speculative)
     {
-      if (!op_queue_[op_type].has_operation(descriptor))
+      if (op_type != read_op || !op_queue_[except_op].has_operation(descriptor))
       {
-        if (op->perform())
+        if (!op_queue_[op_type].has_operation(descriptor))
         {
-          lock.unlock();
-          io_service_.post_immediate_completion(op);
-          return;
+          if (op->perform())
+          {
+            lock.unlock();
+            io_service_.post_immediate_completion(op);
+            return;
+          }
         }
       }
     }
 
-
     bool first = op_queue_[op_type].enqueue_operation(descriptor, op);
     io_service_.work_started();
     if (first)
diff --git a/asio/include/asio/detail/epoll_reactor.hpp b/asio/include/asio/detail/epoll_reactor.hpp
index 0f21971..6367398 100644
--- a/asio/include/asio/detail/epoll_reactor.hpp
+++ b/asio/include/asio/detail/epoll_reactor.hpp
@@ -179,7 +179,9 @@
 
     if (descriptor_data->op_queue_[op_type].empty())
     {
-      if (allow_speculative)
+      if (allow_speculative
+          && (op_type != read_op
+            || descriptor_data->op_queue_[except_op].empty()))
       {
         if (op->perform())
         {