这是一个错误.我已经能够通过在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 we're 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();

}

调试:

[twsansbury@localhost bug]$gdb a.out

...

(gdb) r

Starting 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_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0

#2 0x00763b3d in pthread_cond_wait@@GLIBC_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_event

unlock() |

尽我所知,修补没有副作用:

if (o == &task_operation_)

return 0;

至:

if (o == &task_operation_)

{

if (!one_thread_)

wake_one_thread_and_unlock(lock);

return 0;

}

无论如何,我已经提交了bug and fix.考虑留意官方回复的机票.

linux非阻塞等待线程,linux – 即使异步I / O操作挂起,只有线程处理io_service正在等待...相关推荐

  1. linux非阻塞通话编程,linux 非阻塞式socket编程求助。。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 一下客户端: #include #include #include #include #include #include #include #includ ...

  2. linux 非阻塞 socket - Google 搜索

    linux 非阻塞 socket - Google 搜索 linux c实现超时.非阻塞socket的函数select - Yunlu Liu (刘云璐) sites.google.com/site/ ...

  3. linux下阻塞的系统调用,Linux下文件的阻塞与非阻塞对部分系统调用的影响

    1.基本概念 所谓的阻塞,即内核在对文件操作I/O系统调用时,如果条件不满足(可能需要产生I/O),则内核会将该进程挂起.非阻塞则是发现条件不满足就会立即返回.此外需要注意的是非阻塞并不是轮询,不然就 ...

  4. java处理异步非阻塞请求_Spring WebFlux 的异步非阻塞处理

    前言 随着 Web Servlet 技术栈的不断发展实现了异步处理与非阻塞 IO,但是其异步是不彻底的,因为受制于 Servlet 规范本身,比如其规范是同步的(Filter,Servlet)或阻塞( ...

  5. Linux非阻塞启动node,Node-单线程、事件驱动、非阻塞I/O

    Nodejs既然这么流行就肯定有它的博大精深之处,自然不是我这还没入门的小白可以掌握的,我就简单说一下目前自己的理解程度. 一.单线程.非阻塞I/O.事件驱动 这是nodejs的三个特点. 单线程 N ...

  6. linux非阻塞的socket EAGAIN的错误处理【转】

    转自:http://blog.csdn.net/tianmohust/article/details/8691644 版权声明:本文为博主原创文章,未经博主允许不得转载. 在Linux中使用非阻塞的s ...

  7. linux非阻塞输入函数,Linux fcntl函数设置阻塞与非阻塞

    转自http://www.cnblogs.com/xuyh/p/3273082.html 用命令F_GETFL和F_SETFL设置文件标志,比如阻塞与非阻塞 F_SETFL     设置给arg描述符 ...

  8. linux非阻塞的socket发送数据出现EAGAIN错误的处理方法

    一.非阻塞socket 非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回.比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上.在 ...

  9. linux非阻塞IO与阻塞IO的应用

    1.为什么有阻塞IO (1)常见的阻塞:wait.pause.sleep等函数,read和write某些特殊文件时 (2)阻塞式的好处,在阻塞等待的进程不消耗CPU运行,提高性能. 2.如何实现非阻塞 ...

最新文章

  1. 不知道这些AI术语,还敢说你很了解AI吗?
  2. 方法论、方法论——程序员的阿喀琉斯之踵
  3. 哪位大兄弟有用 cMake 开发Android ndk的
  4. 计算机的硬件工作原理(图片部分资源摘自王道考研资料)
  5. 近年来NLP在法律领域的相关研究工作
  6. BZOJ.1029.[JSOI2007]建筑抢修(贪心)
  7. clickhouse语句_Siem落地方案:初识clickhouse
  8. 【转】ASP.NET AJAX入门系列(8):使用ScriptManager控件
  9. HEVC 推出专利使用费标准
  10. react18新特性
  11. Unity关于Oculus Quest2 入门开发:(二)将Unity发布的apk文件安装到Oculus Quest2
  12. 如何使用 IT 服务台调查来提高满意度
  13. 聊一聊ThreadLocal内存泄漏的问题
  14. SEO的图片优化和关键词
  15. Ardunio开发实例-旋转角度传感器
  16. linux的日志处理之Logrotate
  17. 关于6pm.com海淘信用卡被要求银行授权码的问题
  18. CCNA实验二十四 路由更新的安全
  19. sqlserver四舍六入五留双函数
  20. ‘Tensor‘ object has no attribute ‘_keras_history‘——keras和tensorflow版本不兼容

热门文章

  1. OceanBase在蚂蚁金服的智能运维实践之路
  2. 超详细!上线一个机器学习项目你需要哪些准备?
  3. 深入解读:获Forrester大数据能力高评价的阿里云DataWorks思路与能力
  4. 云安全的新战场上,要靠什么来抵御威胁
  5. 数据库连接池的原理没你想得这么复杂
  6. Storm精华问答 | storm与Hadoop区别?
  7. GitHub 被爆开始实名制,以便于执行美国贸易制裁;特斯拉推出超大储能产品Megapack;高通宣布与腾讯游戏达成战略合作……...
  8. Hadoop精华问答 | hadoop能干什么?
  9. Gartner:PaaS 和平台架构领域的 4 大趋势 | 技术头条
  10. 设置android应用闪屏图片_Android实现启动页面(闪屏页面)