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

这是一个错误.我已经能够通过在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.考虑留意官方回复的机票.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux创建文件内容三行,shell之创建文件及内容的方法示例

shell之创建文件夹&#xff1a;[rootvbox-nginx shell_command]# vi ./mkdir.sh#!/bin/shparentDir"/media/sf_Project/self/smarty-frame/application/$1"fileName$2dirAndName$parentDir/$fileNameif [ ! -d "$dirAndName" ];thenmkdir $dirAndNameecho …

linux设备模型的主要功能,Linux设备模型(3)

Linux设备模型(3)_Uevent作者&#xff1a;蜗蜗 发布于&#xff1a;2014-3-10 20:39分类&#xff1a;统一设备模型1. Uevent的功能Uevent是Kobject的一部分&#xff0c;用于在Kobject状态发生改变时&#xff0c;例如增加、移除等&#xff0c;通知用户空间程序。用户空间程序收到…

lua_path环境变量设置linux,ubuntu16.04安装lua环境

1.官网下载源码 https://www.lua.org/download.htmlcurl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gztar zxf lua-5.3.5.tar.gzcd lua-5.3.5make linux test2.安装中报错lua.c:82:31: fatal error: readline/readline.h: 没有那个文件或目录compilation terminated.: recip…

动态度量 linux,动态可信度量.ppt

动态可信度量提纲 静态可信度量根 动态可信度量根 Flicker: Minimal TCB Code Execution 静态可信度量的问题 2006年&#xff0c;德国Dresden大学的研究者发现现有的静态可信度量根存在着如下缺陷&#xff1a; 引导装载程序(Bootloader)中存在bug Dartmouth的Bear project的可信…

linux svn 面板,Linux下SVN服务器搭建(CentOS+Subversion)

安装(centos下yum即可方便的完成安装)# yum install subversion测试安装是否成功&#xff1a;# svnserve --version 回车显示版本说明安装成功建立版本库# mkdir /svndata 创建svn数据目录(目录可自行制定)# svnadmin create /svndata/kumingkuming就是版本库的名字&#xff0c…

华为手机怎么下载linux命令,在linux命令

REMOTE_DIR为将根证书上传到弹性云服务器的文件目录。 Windows操作系统下&#xff0c;请使用远程连接工具上传根证书。 连接数据库实例。 方式一&#xff1a;通过Linux命令连接实例 ./mongo --host--port-u-p--authentic目录。 Windows操作系统下&#xff0c;请使用远程连接工具…

edHat linux光盘引导,[原]个性化Linux发行版光盘之补充——XZ(LZMA算法)

红帽(Red Hat)从Enterprise Server 6.2 开始&#xff0c;启动镜像文件initrd.img 开始改用xz 工具进行压缩&#xff0c;这与以往版本是有区别的。一、启动镜像initrd.img 文件类RedHat 系统从vmlinuz 核心引导后&#xff0c;会读取initrd.img 启动镜像。该文件中包含驱动模块等…

c语言用指针变量输入数组的长度,C语言之数组的基础练习题(指针变量做函数参数)...

1、交换两个变量的值&#xff1a;#include void swap(int *a,int *b){int tmp;tmp*a;*a*b;*btmp;}void main(){int x,y;int *p_x,*p_y;printf("请输入两个数&#xff1a;\n");scanf("%d",&x);scanf("%d",&y);p_x&x;p_y&y;swap(p…

c语言 p *p,C语言之指针*p++和*(p++)区别

在C语言的指针运算中&#xff0c;经常会碰到以下用法&#xff1a;*p、*p、(*p)、*(p)&#xff0c;在解决问题前&#xff0c;先了解一下基础&#xff1a;1、 * 号和 符号属于同级运算&#xff0c;且优先运算顺序是从右到左。2、a 表示&#xff1a;在当前一整句代码中&#xff0…

皮尔洛和c罗讲什么语言,皮尔洛:如果我跟C罗是队友 我可能能成历史助攻王

皮尔洛&#xff1a;欧冠夺冠热门不包含皇马腾讯体育11月2日讯 近日皮尔洛在接受媒体采访时表示&#xff0c;本赛季欧冠的争夺将会十分激烈&#xff0c;除了尤文外&#xff0c;有四支球队也是欧冠桂冠有利的争夺者&#xff0c;但并不包括卫冕冠军皇马。另外皮尔洛还表示&#xf…

两条直线求交点c语言,C§ 3.3.1两条直线的交点坐标(5页)-原创力文档

3.1两条直线的交点坐标学习目标1&#xff0e;掌握判断两直线相交的方法&#xff1b;会求两直线交点坐标&#xff1b;2.体会判断两直线相交中的数形结合思想.学习过程一、课前准备&#xff1a;(预习教材P112~ P114&#xff0c;找出疑惑之处)1&#xff0e;经过点&#xff0c;且…

C语言一维数组实现杨辉三角,一维数组实现杨辉三角

杨辉三角Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 43411 Accepted Submission(s): 18254Problem Description还记得中学时候学过的杨辉三角吗&#xff1f;具体的定义这里不再描述&#xff0c;你可以参考以…

c语言读取nc文件格式,nc文件资料地读取与处理.doc

标准文案.nc?文件的查看和处理2013-08-04 12:45阅读&#xff1a;2,168最近在学习冰后回弹模型( http://www.atmosp.physics.utoronto.ca/~peltier/data.php)&#xff0c;里面给出的数据为nc(netcdf)格式的&#xff0c;读取是个问题&#xff0c;在言深深的帮助下&#xff0c;成…

android 界面跳转封装,【Android】Fragment跳转系列

一、同一个Activity下Fragment之间相互跳转(含带参数)Fragment1跳转到Fragment2中1.封装一个方法这样封装是方便一个Activity下有多个Fragment来回跳转public interface RegisterTrigger {void triggerView(Fragment fragment);}2.当前Activity继承RegisterTriggerpublic class…

android 调用系统短信接口开发,聚合数据Android SDK 短信api接口验证演示示例

1.到libs聚合SDK是聚合数据平台,为移动开发者提供的免费数据接口.使用前请先到聚合平台(http://www.juhe.cn/)注册,申请相关数据.2.下载聚合数据SDK,将开发包里的smscaptcha_sdk_v_1_1.jar拷贝到libs根目录下&#xff0c;将libJuheSDK_v_1_0.so拷贝到libs\armeabi目录下,如图:3…

扇区 修复 linux,linux – 如何使用hdparm来修复挂起的扇区?

SMART正在说明我服务器硬盘上的一个待处理扇区.我已经阅读了许多文章,建议使用hdparm“轻松”强制磁盘重新定位坏扇区,但我找不到正确的方法来使用它.我的“smartctl”中的一些信息&#xff1a;Error 95 occurred at disk power-on lifetime: 20184 hours (841 days 0 hours)W…

android获取操作系统版本号,Android 获取手机的厂商、型号、Android系统版本号、IMEI、当前系统语言等工具类...

1、获取手机制造厂商2、获取手机型号3、获取手机系统当前使用的语言4、获取Android系统版本号5、获取手机IMEI串号6、获取手机中的语言列表SystemUtil类1./**2.* 系统工具类3.* Created by zhuwentao on 2016-07-18.4.*/5. public class SystemUtil {6.7./**8.* 获取当前手机系…

android显示矩阵大小,关于android:显示代表灰度图像的双值矩阵

我的问题是&#xff1a;我有一个字节数组&#xff0c;必须与ImageView一起显示。 这是我的代码&#xff1a;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ImageView imageView (…

android 跨应用,Android跨应用获取资源

跨应用获取资源有两种方式方式一 利用PackageManagerPackageManager pm getPackageManager();Resources rs null;try {rs pm.getResourcesForApplication("com.example.test");// getIdentifier方法使用如方式一二中使用均可String text rs.getText(rs.getIdenti…

代码混淆android.mk,利用ollvm进行代码混淆

OLLVM简介OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学于2010年6月份发起的一个项目&#xff0c;该项目旨在提供一套开源的针对LLVM的代码混淆工具&#xff0c;以增加对逆向工程的难度。OLLVM是基于LLVM实现的&#xff0c;LLVM是一个编译器框架&#xff0c;它也采用经典的三段…