摘要: Interlocked系列函数可以对内存进行原子操作,它是如何实现的? 它的实现依赖于底层的CPU架构。对于某些CPU来说,这很简单,例如x86可以通过LOCK前缀直接支持Interlocked操作(有一个额外的特性就是XCHG指令总是隐式包含了LOCK前缀)。IA64和x64也直接支持原子的load-modify-store操作。 其它的多数CPU架构把这个操作分成两部分,被称为Load-link/store-conditional。第一部分(load-link)从指定内存地址读取一个值,并且处理器会监视这个内存地址,看是否有其它处理器修改该值。第二部分(store-conditional. 阅读全文
posted @ 2013-09-15 03:13 pianoid 阅读(3598) 评论(0) 推荐(0) 编辑
摘要: 好长时间不更新博客了,今天终于把毕业设计答辩完了,虽然没完全做到自己预先设定的目标,但是起码算是效果出来了。虽然很长时间不更博客,但是订阅的RSS倒也没扔下,坚持读一读,今天这篇文章就是根据msdn博客的一篇博文写成的,只是添加了一些代码,有愿意看英文的请移步到这里。 从Vista开始,想阻止系统关机就开始变麻烦了,不能只拦截WM_QUERYENDSESSION了,操作系统只给一个应用程序两秒钟的时间去保存自己的东西,两秒钟之后,不管做完了没有,Game Over!可是如果你正在刻录一张光盘呢?两秒钟是都不够的,所以Vista之后也给提供了一种方式阻止系统关机,就是ShutdownBlo... 阅读全文
posted @ 2012-06-20 20:04 pianoid 阅读(9472) 评论(0) 推荐(1) 编辑
摘要: 找工作前写了篇blog说要做些常见的笔试面试题,像单链表反转啊字符串反转啊之类的题目,但是只写了一篇单链表反转就没再继续写下去,因为觉得实在没什么好写的,不过都是一些简单的指针操作罢了,但是还是有很多新手问这个问题,而且我在腾讯二面的时候也被要求实现这个函数,那我也写一篇blog介绍一下字符串反转吧。 C语言中所谓的字符串不过是字符数组,后跟一个0x00字符标识结尾,所以反转起来很容易,只要一个循环依次将第一个字符和最后一个字符交换,第二个字符和倒数第二个字符交换……如果最中间有两个字符(即需要反转的字符串长度为偶数),那就交换,如果最中间有一个字符(即需要反转的字符串长度为奇数),那就... 阅读全文
posted @ 2011-10-30 22:05 pianoid 阅读(75696) 评论(7) 推荐(3) 编辑
摘要: 签完offer后感觉人一下子就懒惰下来了,整天除了上课答个到就是跟群里同样签了offer的同学一起瞎聊,最近几天终于又静下心来拿起书继续看。 前几天读到第三部分内存管理的第16章线程的堆栈时看到作者提到了“C/C++运行期库的堆栈检查函数”,作者说这个函数叫StackCheck,并且给出了一段C语言代码来实现这个函数,昨天下午自己写了个程序测试了半天,分别定义了一些大小为40KB、80KB和320KB的数组,却发现线程被创建后已经是将比数组所需更大的栈内存提交到了物理存储器(即使只定义不使用这个数组),连我自己都不相信Windows和VC编译器会这么傻……在微博和群里问了很多人也没得到答... 阅读全文
posted @ 2011-10-28 21:04 pianoid 阅读(6686) 评论(0) 推荐(3) 编辑
摘要: 这几天又翻出一本《C++大学教程·第五版》看,看着看着就看到Fibonacci数列,很简单就写了个递归想算一下,代码非常朴素,但是没想到居然这么慢,加上个GetTickCount()函数一看,算到第40个数就耗费了大约31秒的时间,实在让人汗颜,在网上搜索了一把,发现了本文http://blog.zhaojie.me/2009/03/tail-recursion-and-continuation.html,大为惊叹,原来递归也是可以优化的,稍微修改了一下变为尾递归再计算,居然只需31毫秒,1000倍啊! 上面那个链接老赵写的很好,我就不浪费口水了,给出朴素的代码和优化后的代码充一下字 阅读全文
posted @ 2011-08-05 22:33 pianoid 阅读(1822) 评论(0) 推荐(1) 编辑
摘要: 昨天在我的vmware workstation里安装了一个ubuntu 11.04,但是昨晚装vmware tools时却一直有问题,安装成功后继续按回车,就会自动运行/usr/bin/vmware-config-tools.pl,进行第一次运行的配置,在这里却出现了问题。到了这个问题时: What is the location of the directory of C header files that match your running kernel?(/usr/src/linux/include) 在这里我直接看都没看就按了回车,没想到却说这个目录不存在,好吧,那就自己找一找,很. 阅读全文
posted @ 2011-07-16 10:46 pianoid 阅读(2180) 评论(1) 推荐(1) 编辑
摘要: 今天上午考网络,马马虎虎吧,及格应该没啥问题,高分可没想过。直到今天早上起床后才开始复习,共计复习了40分钟,只能跟着目录在大脑里把知识点回想一遍,稍微翻一下书。对于我一直裸考这件事情,有个roomate表示灰常羡慕…… 言归正传,上篇博客提到了用命令行传递句柄,而且说有时间了写一下用消息和环境变量传递句柄,今天下午好好玩了一下午,刚才觉得该写一下了,然后突然反应过来——这基本上就是照抄上文的代码嘛。于是新建工程复制代码,稍微修改了一下就成了本文,只写了用消息传递句柄的。汗,我越来越打酱油了。 再次申明一下,这三种方法不管哪一种都有一个前提,就是打开句柄时使用的SECURITY_ATTRIB. 阅读全文
posted @ 2011-07-05 19:27 pianoid 阅读(724) 评论(0) 推荐(0) 编辑
摘要: 今天继续读《Windows核心编程》,读到了第3.3节——跨进程边界共享内核对象,先来动手写第一个程序,用命令行参数在父子进程之间传递可继承的句柄。这个程序写的很痛苦,因为对API编程还不够熟悉,老是存在各种各样的问题,早晨六点整就爬起来,一直鼓捣到十二点半才算写完,真无语了。 对象句柄是可以继承的,当然前提是在父子进程之间继承。想获得一个可以继承的句柄,应该在使用相应的Create*()函数时,将SECURITY_ATTRIBUTES结构体的bInheritHandle域要设置为TRUE。 创建子进程时将CreateProcess()函数的第五个参数bInheritHandles也设置为T. 阅读全文
posted @ 2011-07-04 14:07 pianoid 阅读(1887) 评论(0) 推荐(0) 编辑
摘要: /******************************************《Windows核心编程》第四版给出的这个例子代码有些问题,**我根据第五版的修正也修改了一下本文,**添加了一张新的测试截图,**重新上传了源代码。****************************************/ 准备从今天起重新捡起《Windows核心编程》这本书认真读一遍,每个代码都自己写一遍,书中提到的第一个例子就是ErrorShow,我也自己写了一个,就当练手吧,控制台程序写多了,windows程序怎么写都快忘光了。 关键代码其实就一个函数,FormatMessage()函数,以前 阅读全文
posted @ 2011-07-02 20:08 pianoid 阅读(1503) 评论(0) 推荐(1) 编辑
摘要: 一开始先给出一段简单的C代码: #include <stdio.h>int main(){ int i = 0; for ( ;i < 3; i++) { int num = printf("hello\n"); if (num != 0) { break; } } printf("aha,bye!\n"); return 0;} 代码非常简单,for循环应该循环3次,但是这里为了更好的演示这个bug,在第一次执行循环内的printf()语句时,程序就会因满足if语句的条件而跳出循环,事实上for循环在这里只会执行一次,这显然不是什么b 阅读全文
posted @ 2011-06-09 18:28 pianoid 阅读(803) 评论(0) 推荐(0) 编辑