空间网站建设,公众号制作一个需要多少钱,二级网站建设检查评比方案,十大软件公司这是一个错误.我已经能够通过在task_io_service :: do_poll_one的非关键部分添加延迟来复制它.以下是booost/asio/detail/impl/task_io_service.ipp中修改后的task_io_service :: do_poll_one()的片段.添加的唯一行是sleep.std::size_t task_io_service::do_poll_one(mutex::sc…这是一个错误.我已经能够通过在task_io_service :: do_poll_one的非关键部分添加延迟来复制它.以下是booost/asio/detail/impl/task_io_service.ipp中修改后的task_io_service :: do_poll_one()的片段.添加的唯一行是sleep.std::size_t task_io_service::do_poll_one(mutex::scoped_lock lock,task_io_service::thread_info this_thread,const boost::system::error_code ec){if (stopped_)return 0;operation* o op_queue_.front();if (o task_operation_){op_queue_.pop();lock.unlock();{task_cleanup c { this,lock,this_thread };(void)c;// Run the task. May throw an exception. Only block if the operation// queue is empty and were not polling,otherwise we want to return// as soon as possible.task_-run(false,this_thread.private_op_queue);boost::this_thread::sleep_for(boost::chrono::seconds(3));}o op_queue_.front();if (o task_operation_)return 0;}...我的测试驱动程序非常基础通过计时器进行异步工作循环,打印“.”每3秒钟一次.生成一个将轮询io_service的线程.延迟允许新线程时间轮询io_service,并且当poll线程在task_io_service :: do_poll_one()中休眠时,主调用io_service :: run().测试代码#include #include #include #include #include boost::asio::io_service io_service;boost::asio::steady_timer timer(io_service);void arm_timer(){std::cout .;std::cout.flush();timer.expires_from_now(boost::chrono::seconds(3));timer.async_wait(boost::bind(arm_timer));}int main(){// Add asynchronous work loop.arm_timer();// Spawn poll thread.boost::thread poll_thread(boost::bind(boost::asio::io_service::poll,boost::ref(io_service)));// Give time for poll thread service reactor.boost::this_thread::sleep_for(boost::chrono::seconds(1));io_service.run();}调试[twsansburylocalhost bug]$gdb a.out...(gdb) rStarting program: /home/twsansbury/dev/bug/a.out[Thread debugging using libthread_db enabled].[New Thread 0xb7feeb90 (LWP 31892)][Thread 0xb7feeb90 (LWP 31892) exited]此时,arm_timer()已打印“.”曾经(当它被武装起来时). poll线程以非阻塞方式为反应器提供服务,并且在op_queue_为空时睡眠3秒(当task_cleanup c退出范围时,task_operation_将被添加回op_queue_).当op_queue_为空时,主线程调用io_service :: run(),看到op_queue_为空,并使自己成为first_idle_thread_,它在wakeup_event上等待. poll线程完成休眠,并返回0,主线程等待wakeup_event.等待10秒后,arm_timer()有足够的时间准备就绪,我打断调试器Program received signal SIGINT,Interrupt.0x00919402 in __kernel_vsyscall ()(gdb) bt#0 0x00919402 in __kernel_vsyscall ()#1 0x0081bbc5 in pthread_cond_waitGLIBC_2.3.2 () from /lib/libpthread.so.0#2 0x00763b3d in pthread_cond_waitGLIBC_2.3.2 () from /lib/libc.so.6#3 0x08059dc2 in void boost::asio::detail::posix_event::wait (boost::asio::detail::scoped_lock) ()#4 0x0805a009 in boost::asio::detail::task_io_service::do_run_one(boost::asio::detail::scoped_lock,boost::asio::detail::task_io_service_thread_info,boost::system::error_code const) ()#5 0x0805a11c in boost::asio::detail::task_io_service::run(boost::system::error_code) ()#6 0x0805a1e2 in boost::asio::io_service::run() ()#7 0x0804db78 in main ()并排时间表如下poll thread | main thread------------------------------------------------------------------------------lock() |do_poll_one() ||-- pop task_operation_ from || queue_op_ ||-- unlock() | lock()|-- create task_cleanup | do_run_one()|-- service reactor (non-block) | -- queue_op_ is empty|-- ~task_cleanup() | |-- set thread as idle| |-- lock() | -- unlock()| -- queue_op_.push( || task_operation_) |-- task_operation_ is |queue_op_.front() |-- return 0 | // still waiting on wakeup_eventunlock() |尽我所知,修补没有副作用if (o task_operation_)return 0;至if (o task_operation_){if (!one_thread_)wake_one_thread_and_unlock(lock);return 0;}无论如何,我已经提交了bug and fix.考虑留意官方回复的机票.