pthread_cond_timedwait时间设置

最近在使用pthread_cond_timedwait的时候,发现当超时时间设置成1秒以下的值时,无法得到想要的效果,具体表现为,没有wait足够的时间就被唤醒,且返回值正确。首先来看一下pthread_cond_timedwait的原型:

#include <pthread.h>
int pthread_cond_timedwait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict abstime);

abstime是一个绝对时间,struct timespce的原型为:

struct timespec
{
__time_t tv_sec;        /* Seconds. */
long int tv_nsec;       /* Nanoseconds. */
};

其中tv_sec是秒,tv_nsec是纳秒(即1000,000,000分之一秒)

那么,看一下我之前出错的代码:

struct timespec abstime;
abstime.tv_nsec = (timeout_ms % 1000) * 1000000;
abstime.tv_sec = time(NULL) + timeout_ms / 1000;
pthread_cond_timedwait(&_read_cond, &_read_mutex, &abstime);

以上代码有问题,主要是因为time(NULL)的返回结果的精度是秒级的,那么如果当前时间是m秒+n毫秒,那么实际等待的时间只是timeout_ms – n,且还有可能发生n > timeout_ms的情况,这种情形下,如果这段代码处在一处while循环内,则会造成大量的pthread_cond_timedwait系统调用,并造成大量的context switch,系统CPU会占用很高。

正确的代码应该改为如下:

struct timespec abstime;
struct timeval now;
gettimeofday(&now, NULL);
int nsec = now.tv_usec * 1000 + (timeout_ms % 1000) * 1000000;
abstime.tv_nsec = nsec % 1000000000;
abstime.tv_sec = now.tv_sec + nsec / 1000000000 + timeout_ms / 1000;

pthread_cond_timedwait(&_read_cond, &_read_mutex, &abstime);

通过gettimeofday获得精确到微秒(1000,000分之一秒)的时间数据,并处理不足一秒加上超时时间超过一秒的情况(即tv_sec上需要加上nsec/1000000000)。

5,822 次浏览 | 没有评论
2012年7月19日 | 归档于 C++, Linux, 技术

MIUI是个好ROM

有句话叫,Android用户有三大爱好,刷机重启拔电池。我向来是不赞同这句话的。没见过有谁电脑买来之后整天装系统玩的,Android的用户之所以有很多人喜欢刷ROM,那是因为有许多不同的ROM可以选择,可以尝试,但是在用MIUI之前,我一直觉得Stock ROM(即官方的)是最好的,尤其是Nexus系列手机原生的Android,即稳定,又灵敏。但是自从Google宣布不再给Nexus One提供升级支持以后,我便开始寻找非官方的ROM来刷,毕竟手机才买了一年,就这样一直用一个不再升级的系统,对我这个升级控来说,是万万不能接受的。我挑ROM的标准很简单:

1、要有类似Stock ROM般的简洁。

2、要有强大的技术团队支持不断更新。

所以大概我能选的ROM也不多,被我看上眼的也就CM7.1和MIUI。

CM是从去年12月份开始用的,很接受原生的用户体验,并且开启A2SD+以后,再也不用担心内部存储空间不足的问题。但是Android 4.0出来以后,CM的全部精力都投入到ICS系统的移植上,CM7不再更新,而且目前我觉得Nexus One没有一个真正完全可用的4.0的ROM(你能想到的那些我也知道,但都不完美)。所以用了三个月以后,闲来无事的一个下午,把手机刷成了MIUI。

MIUI用了一周,我觉得MIUI是个好ROM:

1、ROOT权限系统在系统中集成。可以打开或关闭,无须自己再破解。

2、Android Market(Google Play)可以访问到所有应用,以前需要装个MarketAccess伪装成米国人才能。PS:我一直没有想明白MIUI是怎么做到这一点的,也许是对Android Market的某些系统属性的请求做了特殊处理,使之误认为不是中国的运营商?

3、主题支持,虽然我不是个追求花哨界面的非主流青年,但是我挺喜欢Nokia的那套圆润的图标的,于是有了主题支持,换之。

4、黑名单,这个其实应该挺实用的,只是大概我也没啥使用场地。

5、集成了A2SD+,在系统属性里也能看到EXT分区的大小,这个就不用自己再刷一遍了。

6、轨迹球解锁,这个功能我很喜欢,当初刷CM也很大一部分原因是因为这个。

7、VPN的密码可以被记住,这个应该是在最近才做出来的功能,在天朝,这个功能很实用。

8、分类设置更加人性化,这个看个人喜好了吧。

9、轨迹球针对不同提醒可以设置不同颜色,大多数人可能都不知道Nexus One的那个LED轨迹球可以发出很多色彩的颜色的吧。

10、流量统计,这个功能很实用,虽然我现在每个月300MB流量也用不完,但是相信大多数人都用得着的。

其实上面大部分功能在CM上都有或者通过某些应用都可以实现,但是我觉得给我一个整合过的方案,我会更加喜欢。虽然MIUI有些ROM是基于CM的内核的,但是MIUI在UI和UE上,确实下了很大的功夫,我想在这方面,Google也未必有MIUI下的功夫大。

很多人说MIUI太像iPhone了,我觉得你如果是指一些基本组件像,那么我认同,但是用户体验上,MIUI绝对不是在模仿苹果。

我用的是RA-passion-2.2.1的recovery,目前看来OTA的时候不能自己刷,需要手工选择sd卡上downloaded_rom里的升级包,只要不选错,OTA是没有问题的,我没有使用MIUI给的recovery。

另外说一下开启A2SD+的方法吧,在终端模拟器里执行:

$ su

# a2sd reinstall

# a2sd zipalign

# a2sd cachesd

执行以上操作后,相当于将/data/app软链到/sd-ext/app以及/data/app-private软链到/sd-ext/app-private,后面的cachesd相当于将/data/dalvik-cache软链到/sd-ext/dalvic-cache。

最后贴张图:

4,237 次浏览 | 4 条评论
2012年3月10日 | 归档于 Android, Google, Mobile
标签: , , ,

怎么样才能做好一件事情?

工作了大半年,自己也有点工作上的心得体会。我所在的部门是基础架构部,我在的组负责了某度大部分的分布式存储产品,当然这些产品都不是直接面向最终用户的,而是提供给不同的产品线,服务于某度不同的产品的。由于岗位的特殊性,所以平时在工作当中,可以接触到许多不同的人。跟别人合作的过程当中,自已对于“怎么样才能做好一件事情”有过一点点思考,特此写下来:

1、要有明确的目标。

这一点说白了很简单,首先要弄明白自己做的事情的目标是什么,我从来都不赞成曲线救国的做事方式,一件事情,想要做好它,就找最直接最有效的方式。任何多余的、无用的东西都不是必须的。如果当前的系统设计目标是为了服务每天100万的访问量,就不需要考虑怎么样能支撑对1000万人的服务。但是需要注意的一点是,有明确的目标,不代标急功近利,即使系统的设计是只能支撑100万的访问量,也要保证以后扩展到可以为1000万人服务时,不需要投入10倍的人力成本。

2、要弄清楚问题的本质。

经常有人来问我一件事情怎么做,在回答他之前,我都会多问一句,你为什么需要知道这件事情的做法。我可能会遇到这样一些人,他从我这里得到的答案可以协助他解决他原来的问题,但是绝对不是最佳的途径。这些人往往自己把自己限定在了一个特定的问题里,不能跳出这个问题看,没有去想想很多问题其实换个方式解决会更简单。

3、要有长远的打算。

虽然我一直强调要有明确的目标,但是我一直很否定那种只为当前做考虑的设计,系统可以支持三种命令,但是如果命令扩展到1000种,还是用判断语句一个一个来实现么。在有限的可预测到的未来,提前做好准备,可以节省日后大量的人力成本。有着良好的架构的系统、完美的基础组件支撑的系统,无论在系统以后的可扩展性、维护性方面,都有很大的优势。

4、协调好人力资源。

我现在只能说,作为一个新入职场的人,做自己擅长做的事情。如果作为一个团队的领导,那就是让合适的人去做合适的事情。很多人之所以失败,就是因为选择了一个自己不擅长的领域。姚明如果去跑110米栏,刘翔如果去打篮球,我想这两个人都没有办法取得今天的成就了吧。但是做自己合适的事情,并不代表遇到困难就退缩,适当的时候,挑战一下自己才能成长起来。

5、沟通的成本

软件这种东西,其实最合适的就是一个人做一个系统,免去人与人之间沟通的成功。但是现在的系动辙几千万行代码,有些时候让一个人独立完成开发确实不现实。当多个人共同完成一件事情的时候,沟通就成了很大的成功,所以很多人整天就是在各种沟通。沟通就会有误解,我觉得对于沟通,最好的作法就是控制时间,不要把沟通变成了头脑风暴,沟通之前一定要有一个人对将要讨论的事情有个大体的框架。

自己工作的时间也不长,很多东西其实也比较幼稚,我就这么一写,看官您就这么一看。有句话说的好,按照大部分人努力的程度,其实根本不需要跟别人去拼天赋。哈哈,努力用心,做好事情其实也没有什么难的。

5,207 次浏览 | 1 条评论
2012年2月19日 | 归档于 学习, 总结, 感悟, 未分类
标签:

吐糟一篇

很久很久没有么有写日志(为什么现在看到日志里,满脑子全是WARNING和FATAL)了,工作以后,每天做的事情大部分都是跟工作有关,我也不知道我遇到的那些问题哪些是能在博客上写的,哪些是不能写的,所以干脆都不写吧,省得违返了某些我不知道的条例。

从入职到现在,三月有余了,从工作的第二个月开始,我就把主操作系统换成了Ubuntu,虽然我们的工作环境几乎不依赖我们所使用的客户端的操作系统,不过觉得即然每天要在Linux写代码、编译、测试,还不如直接就换成Linux得了。不过要喷一下公司的IM软件,没法在Linux下用,Web版功能太弱,不能多人会话,不能保存聊天记录,一断网就啥都没有了,现在逼着我每天还得开个VirtualBox,跑个XP里面跑个百度Hi。继续向一个合格的Linux程序员进化。浏览器还是用Firefox+Pentadactyl,LibreOffice我基本上也能忍了,苦序员阶段还是很少有机会写Word和PPT的,ThunderBird装了Conversations和Lightning两个扩展以后,基本上我还对这个邮件程序比较满意。嗯,另外自己重新编译了个Screen的新(话说这代码也是2006年之后就没有更新了的)版本,基本上现在用着也不会coredump了,VIM也积累了一些自己用着顺手的插件,以至于现在到别人的环境里写代码会感觉很不适。虽然我觉得Ubuntu对多显示器的支持有些烂,但是多虚拟桌面的功能还是很赞,随便切来切去,基本上可以让整个人多线程起来,写代码的间隙不影响看邮件,不影响处理别人的问题。嗯,前段时间看了下gdb里的tui功能,让我的“GDB真难用”的观念发生了巨大的变化,并且对于我们这种只能在终端调试程序的苦程来讲,gdb也是唯一能用的调试工具,用好它,平时的工作可以事半功倍。俗话说,工欲善其事,必先利其器,感觉这几个月确实学会了不少利器啊。

现在起床的时间越来越晚,回家的时间也越来越晚,好在不用挤地铁,好在每周都能完整的休息两天,好在每天做的事情自己也能沉浸在其中,以至于经常感觉一周的时间很快就过去了。周末的时候像个家庭主妇似的收拾家里,自己去买买菜,自己做点饭,倒也算不错。

貌似博客现在访问的速度很慢,我用代理访问就没有任何问题,难道Godaddy的服务器也被某墙污染了?不得其解。

4,862 次浏览 | 6 条评论
2011年11月3日 | 归档于 工作, 总结, 感悟, 生活
标签:

主机换到国外了

为了访问国外的资源方便一些,我把AgilePHP,也就是我的博客的主机换到了国外自己在GoDaddy上买的主机,现在升级WP、安装插件的速度也快一些,并且由于一些众所周知的原因,换到国外,可能装一些插件会比较方便。

非常感谢叶博这几年无偿提供的主机空间!

4,016 次浏览 | 2 条评论
2011年8月12日 | 归档于 互联网, 博客
标签:

iPod Touch 4

终于在这个26岁生日的时候,完成了一个小小的心愿,入了第一个iDevice,泡泡送了我一个iPod Touch 4。通过这段时间的使用,我对iOS总算有了一个比较切身的体会。当年买Nexus One的时候写过一篇评测,今天也写一篇吧,算是从一个互联网从业人员的角度来观察苹果的产品,并且尽量从中立的角度来比较一下iOS(iPod Touch 4)与Android(Nexus One)的优缺点。

1、外观
第一点就说说外观吧,iTouch 4很薄,以致于我现在拿着Nexus One就觉得它又厚实又重,苹果的工业设计很棒,做出来的东西在视觉和感觉上会比实际的尺寸给人更薄的感觉。

2、操作
Android最明显的特征就是一般来说正面有4个按键+一个滚球,从第一眼看到这种设计我就觉得完全没有必要设计成4键,完全可以把操作的按钮放到界面上,我觉得只有Symbian的一些触控机器的通话、挂机键的设计要比这更扯蛋了。

3、电池
iTouch号称播放音乐可以40+小时,播放视频可以7小时,如果一直用来上网的话,其实一样不给力,不比Android的电话更牛逼。

4、界面
说不上iOS的界面就比Android更美观,甚至一些程度的操作流畅度不如Android(比如一些Twitter客户端滑动明显没有Nexus One流畅),是因为内存太小么?iTouch的内存只有Nexus One的一半。iOS 的界面设计比较适合一般的消费者,而Android的界面似乎面向的还是Geek工程师。

5、通知系统
iOS的通知系统烂,真的很烂,听说iOS 5里要改成与Android一致的样子,可以下拉标题栏。我好几次在iTouch的界面想下拉标题栏,都没成功,升级iOS 5后应该可以了。不过iOS的图标上的“数字通知”真是大赞啊,充分利用了已有的空间,向用户展示更多的信息。

6、VPN
Android的VPN连密码都不能记忆,而在iOS上连VPN只需要滑一下即可,哎(别跟我讲换ROM,换ROM我也知道)

7、游戏
Android上的游戏很多不要钱,iOS上的游戏大部分都要钱。App Store里的收费游戏基本上的我在Android上都玩过了。

8、应用市场
App Store和Android Market,菜市场的速度在中国还是很给力的,而App Store下程度却有点慢,不知道是不是因为我是用的iTunes美国账号的原因。只有在开了VPN以后,下载程序的速度才比较给力。

9、任务管理
我觉得苹果的理念还是对的,不需要用户去关心有哪些任务在后台,我需要关闭哪些任务来释放空间,操作系统会帮你做所有这些事情。电子消费产品有些时候要少给用户引起选择。这一点其实Android的处理也是类似的,只是有好事的人做出了各种各样的Task Killer。

10、越狱
MS这个是智能手机永恒的主题,手机制造商和移动运营商为了保证手机的稳定性,往往对手机进行了一定的限制,所以就有人想出各种办法,解除这种限制。目前看来,除了iOS上笔划输入法那大大的按键让我不舒服以为,我可以通过越狱安装百度输入法,没有别的什么有让我越狱的冲动了。装盗版软件嘛,想想还是算了,真的有好的软件就买几个呗,常用的软件也都是免费的。

11、Twitter
我对Twitter还是比较依赖的,我安装了Twitter for iPhone、Echofon for iPhone、TweetCaster、Twitterrific、TwipBird、HootSuite和TweetDeck,只有官方应用和TwipBird支持API,嗯,这些应用的体验反而不如Seemic for Android。不过官方支持API倒挺好的。(注意要用Twip 4的O模式哦!)

嗯,iPod Touch在野外不能上网确实比较尴尬,特别对于我这样一相拿它来当一个移动互联网终端的人来说,不过用Nexus One的WiFi共享可以完美解决这个问题,哈哈,乔帮主也不会想到有人会通过Android来保持iPod在线的吧?

3,385 次浏览 | 1 条评论
2011年8月10日 | 归档于 Android, Apple, Google, iOS, iPhone, iPod Touch, Mobile, Nokia, 互联网
标签:

入职半月小记

上班快一个月了,其实环境都还好,比较符合我对工作的要求,忙也倒不算是特别忙,压力嘛,作为新人,肯定有一点,但好在导师、同事、经理人都比较Nice,有问题可以随时找人问。接触到的东西也算是符合我的预期,每天的工作流程基本上可以总结为:

ssh
screen -r work
vim
make
./run_test
现在才觉得以前用vi用到弱爆了,用shell也用得弱爆了,这些工具果然日常不用,光是知道看过读过DOC是没有用的,不实践是出不了真知的。嗯,自觉的Python也派上了用场,可以很方便的写一些脚本,看组里的脚本大部分还是用perl和shell写的,想想也无所谓吧,反正用脚本的人不会关心这脚本是什么语言实现的。公司给配的小黑也很给力,可是想想我们开发也不用在本地做,这么牛逼的机器纯粹就是浪费啊!
加油工作!闲言碎语就说到这了!

3,549 次浏览 | 1 条评论
2011年8月10日 | 归档于 未分类
标签:

26岁了

终于到了不想过生日的年龄!以前每次过生日我都会很开心的写一篇日志记录一下这一年获得的成长,展望一下未来,可是唯独这次(我想以后每次应该都是吧?直到有孩子?),觉得过生日真不是件啥好事情啊,不是又长了一岁,而是又老了一岁。10年到11年度,人生经历中最重要的成分应该就是找工作了,关于这个,我以前的日志里,写里很多很多。除此以外,经过我三年时间的奋斗,终于毕业了,顺利的拿到了毕业证和学位证,学历从本科变成了硕士。其实回想起这三年来,过得也不容易,有许多怨言,学习上也遇到过很多不顺利的事情,不过总算都是挺过来了。我这个人一向是经历困难的时候很能挺但也是一肚子苦水不知道该找谁倒(可怜了泡泡了~),可是困难解决了过去以后,也就不那么在乎了。

最近这几年在北京呆着的经历就是所有的事情都不怎么顺利,但是所有的事情在最好都顺利解决了。

还是展望一下未来吧,话说已经入职有一个月了,还算是比较适应某度的工作节奏,每天按照读书的时候的时间起床,各种办法解决早饭,然后搭着地铁去上班。9点钟到公司,开始一天的工作,晚上8点左右回来,其实也还好,不是很累,也不用像在学校的时候那样每天11点钟才回宿舍;而且周末可以正常休息,这一点满足了我对工作的基本要求。

未来的一年,希望自己工作顺利,希望生活顺利,希望家里人都平安健康,嗯,到明年过生日的时候再想想是不是要在2012来了之前把婚结了呢?哈哈……

3,024 次浏览 | 1 条评论
2011年8月8日 | 归档于 总结, 感悟, 生日
标签:

明天入职

其实更想说的不是明天入职,而是自己学生生涯结束了。从幼儿园到上小学到现在,已经上了4+19年的学,自己应该算是个好学生吧。在毕业答辩结束那天,我给自己的MSN签名改成了“Step 1:Done”。我觉得学生生涯是人的一生里的第一步,第二步便是工作和事业,第三步是年老享天伦之乐。人的一生也就这么短短不到百年,分成这三个阶段足矣。

这篇文章倒不是想对这4+19年的学生生涯作个回顾,我想若是真要去回顾,几乎应该可以写本书出来,每一个阶段都有一些令自己难忘的故事。不过今天对过去三年在中科院学习的经历倒是可以回顾一下。当时选择保送到这里,本着“研究生也可以做些研究”的目的,想体验一下与大学时候软件学院完全不同的氛围与学习方式。软件学院主要还是以培养学生的个人工程能力为主,所以我们学习很多新的技术,参加很多比赛,掌握很多与工业界相关的知识。而科学院则是完全不同的,在这里我主要完成了两件事情:第一是发表自己的一篇小论文,第二是完成自己的毕业论文。写论文与写代码的方法是完全不同的,写代码只需要去参考一本语言规范即可,写论文要调研非常非常多的资料,提出自己的问题,提出解决问题的办法,对自己的办法进行评估和验证。

研究生一年级的时候基本都在上课,那个时候课程上得其实也不轻松,特别是“随机过程”上得我是特别痛苦,追根究底,主要是因为本科的时候学的课程跟这门课要求的一些基础没有重叠,自己把相关的基础知识几乎是学习了一遍,算上复习一共用了1个月的时间,每天早上起来去上自习,上到很晚才回来,我觉得我本科的时候都没有这么大的动力能坚持上一个月的自习。最后考试的时候倒还令我满意,取得了一个良好的成绩,我觉得这件事情,基本上就是我研一时候的一个小小缩影吧,上课,学习。

研究生二年级是我这三年里最痛苦的一段日子,当时做的东西是想把发布/订阅系统(我们组里的老传统)和云计算结合在一起做一个新的系统,这方面最令人困扰的就是没有可以参考的东西。而且自己在大四做毕设和研一的时候接触的都是我们组另一个传统项目服务发现,所以本身对发布/订阅系统也不太熟悉,只能摸着石头过河。而且由于原来系统所设定的目标跟现在所设定的目标有所不一致,所以还需要更改原来的系统修复一些BUG。我这人向来是讨厌给别人擦屁股的,可是那个时候擦了半年的屁股。而且有大概整整一个多月的时间,每天做实验做到夜里2、3点才回宿舍,早上8点起床继续去实验室,到最后自己熬得都必须每天喝大量的咖啡才能坚持过来。不过最后还是熬过来了。小论文虽然初投ICEBE的时候被拒,但是后来投EUC的时候顺利通过了。这得多多感谢金老师的指导和帮助。

研究生三年级,其实也是跌跌撞撞过来的,先是很认真的准备找工作,后来经过了曲曲折折的路拿到了百度的Offer,这是个我心宜的Offer,然后很Happy的去香港参加EUC的会议,开完会在香港还玩了两天。接着无心插柳地又拿了微软的Offer,小纠结了一下,最终还是选择去了百度。然后就是准备毕业论文,毕业论文写了50000多字,可是真没觉得自己写了很长时间,有那个两个星期,每天写一点,每天写一点,也就写出来了。我觉得最重要的事情是因为有东西好写,所以不愁写不出来。当然在开发毕业论文里涉及到的系统的时候出现了一些问题,我觉得在一个团队里首先要统一每一个人的思想,大家只有往一块起,劲往一块使,才能保质保量的完成任务。后来的中期检查、毕业答辩也算是比较顺利。接着就是找房子,然后就是参加毕业典礼,然后办各种各样乱七八糟的手续,就晃当到今天了。

明天就要入职了,祝自己在第二步里一切顺利。

5,109 次浏览 | 7 条评论
2011年7月12日 | 归档于 学习, 总结, 感悟, 校园, 生活

毕业进行时

毕业答辩顺利通过了,昨天晚上,8点的时候。

通过之后也没有想像中的那样轻松,从得知答辩日期之后就一直在等待着这个时刻发生,我是所有人里第一个批次第一个答辩的,知道这一点反而让我觉得很高兴,不用看着别人都答辩完了自己再上去讲。昨天一整天自己都算是处在一种“兴奋”的状态,期望着早点答辩早点结束这件事情。最终还是顺利地结束了。

其实从研二开始就期待着这一刻,因为我觉得对于研究生的生活我有太多的感触,但是在旅途结束前就总结经历,总觉得太那啥,其实现在我也不想说,等真毕业了再写一篇吧。三年,憋了一肚子话。

2,422 次浏览 | 没有评论
2011年5月31日 | 归档于 同学, 回忆录, 学习, 总结, 感悟, 校园, 生活
标签: ,