随笔分类 -  1.首页原创精华区

摘要:原理 在linux平台下编译由多个源码文件或目录组成的项目工程时,需要编写make脚本即Makefile文件来编译,当项目工程宠大时,这种方式比单纯地使用gcc命令行方便快捷,且易于维护。由于具体工程的源码文件数量的多少及名称的不同,因此编写一个较为通用的Makefile文件,来实现编译各种不同的工 阅读全文
posted @ 2012-08-16 19:29 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:信号量是一种用于并发环境同步手段的原语,分为无名信号量和有名信号量两种,前者只能用于线程间同步,而后者还可用于进程间同步。它包括创建、等待、挂出、取值和销毁5种基本操作。与互斥锁不同的是: ● 信号量拥有一个计数值,表示可用的资源数量,仅当该值为0或1时,则相当于互斥锁。 ● 信号量是条件式加锁,即 阅读全文
posted @ 2012-07-20 10:52 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:互斥锁,用来保证任一时刻只有单个线程或进程拥有对共享资源的互斥访问权,在这里将posix thread中的互斥体、win32中的互斥体和临界区,统称为互斥锁,其特点如下: ● 范围:线程锁和进程锁,前者仅用于同一进程内多线程间,而后者用于进程间,显然,它也能用于同一进程内多线程间,但效率较低。pos 阅读全文
posted @ 2012-06-23 00:08 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:socket pair,也称套接字管道,主要用来实现进程内或进程间的一对一的全双工或半双工通信,在IO复用模型(如select,poll,epoll等)中起到通知中断退出循环的作用,在类UNIX系统中已经有现成的实现,API为socketpair,但在Windows系统中没有,因此本文主要讲述Win 阅读全文
posted @ 2012-06-17 03:02 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:自旋锁作为一种并发同步的手段,特别适用于竞争少和锁时间短的情况,在驱动及内核代码中经常被用到,本文讲述一种适合用户态程序的自旋锁,支持Windows和Linux(GCC>=4.1.2)平台,并提供了C语言的接口和实现。 接口 spin_trylock如果获取成功返回1,否则返回0;spin_is_l 阅读全文
posted @ 2012-06-13 21:02 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:主类模板 gcc从4.1.2版本开始提供了__sync_*系列的内置API,用于加减和逻辑运算,可以对1,2,4,8字节长度的数值或指针类型进行原子操作,为方便使用,笔者对这些API作了简单的封装。 Code highlighting produced by Actipro CodeHighligh 阅读全文
posted @ 2012-06-08 00:19 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:类型选择是一种编译时的类型计算技术,也就是根据条件判断来匹配对应的类型,功能形如运行时的if else和switch case控制结构。在这里仿真运行时的条件语句,实现了类型选择,包括if单分支、if多分支和switch case三种结构,关于其原理及细节就不多讲了,直接看如下代码 (1)if单分支 阅读全文
posted @ 2012-06-06 13:49 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:基本原理 在数据输入随机分布的情况下,快速排序具有较好的性能表现,但当元素个数比其关键字的取值范围大,而这个范围相对较小时,使用一种关键字索引统计排序会快很多,因为它的时间复杂度是线性的,基本原理是使用数组(为描述方便,特称统计数组),其下标对应关键字的值,存储元素按待排序关键字的值统计的出现次数, 阅读全文
posted @ 2012-05-31 12:11 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:本文就Loki编译期技术中的类型列表Typelist作了一些扩展,增加了以下几个方法: • 获取最大和最小长度,即求取Typelist中长度最大和最小的值 • 获取最大和最小类型,即求取Typelist中长度最大和最小的类型实现 位于Loki::TL命名空间,利用递归计算最值结果,使用宏生成主类模板 阅读全文
posted @ 2012-05-29 01:03 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:基本原理 快速排序算法是一种分治排序算法,影响其性能的因素有划分元素的选择、小的子文件的处理、重复关键字等,本文论述针对重复关键字的改进实现。首先来回顾下一般的算法实现,其流程如下: a. 选择一个划分元素,这个元素在划分后将在最终的位置上,通常是选择最右端元素作为划分点。 b. 从左端开始扫描,直 阅读全文
posted @ 2012-05-19 14:48 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:C与C++ API的比较 在c语言中,API体现为c函数,如操作系统提供的一系列API,在c++中,API体现为自由函数,这里的自由函数是指除普通成员函数、静态成员函数、友元函数外的能在某命名空间作用域或全局空间内直接访问的函数,而这更多地体现为函数模板,如stl提供的一系列算法swap、count 阅读全文
posted @ 2011-12-24 19:08 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:关于cstatic控件的自绘,网上也有很多的代码及文章,更有其界面画得很漂亮的、多种多样的功能。近来我自行封装实现了一个真彩色静态框类,目标初衷是从颜色、字体、光标入手,改变原始标准cstatic的色彩风格,使界面初步美化,具有好看的效果。同时作为一个基础简单的类来维护,为后续的功能增强及美化提供参 阅读全文
posted @ 2011-12-18 00:54 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:在《多标签视图类CTabView的设计实现》一文中,CTabView从CBasicSubClassWnd私有继承,重写其虚函数SubWindowProc,捕获WM_DRAWITEM和TTN_GETDISPINFO消息,从而实现了DrawItem和UpdateTooltipText虚函数回调机制,支持 阅读全文
posted @ 2011-12-11 11:07 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:在MFC9(在vc2008和vc2010中,已经有了CTabView的现成类)以前的版本中,有CListView,CTreeView,CEditView,CRichEditView等控件视图类,但就是没有类似的CTabView类,因工作需要,最近在做一个简单的多标签IE浏览器,开发环境是vs2005 阅读全文
posted @ 2011-12-11 00:47 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:关于系统托盘图标类,网上也有很多的代码,但都不太简洁灵活易用,为了这一目的,本人自行封装了一个API版本的实现类,这个类的设计思想来源于观察者模式,从而较好地解耦了托盘通知消息的发送、接收、处理这三者间的关系,使这三者可以是同一个对象,也可以是不同的对象,具体的情况可根据业务逻辑灵活选择控制,主要包 阅读全文
posted @ 2011-12-04 03:15 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:在开发HTTP相关程序时,经常会碰到从网络链接URL中提取协议名、服务器、路径等目标对象,如果使用C/C++字符串操作函数,那么则显得有点麻烦且代码不易维护,其实关于文本内容的解析工作,都可优先考虑使用正则表达式库来解决处理,C++方面的正则库也有很多种,如atl、pcre、boost。下面就使用b 阅读全文
posted @ 2011-11-27 17:22 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:在《基于stl序列容器实现的通用集合类》一文中,已经讲到了具体实现,近来因再次用到它又改进完善了,主要体现在以下几点:1)增加了查找操作方法,支持按值类型和谓词条件两种方式。2)增加重载了按值类型和谓词条件2种方式删除元素的方法。3)增加了2个模板参数以支持线程安全,一个是线程模型模板类,一个是互斥 阅读全文
posted @ 2011-10-21 18:43 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:本文讲述双端堆的5个公开泛型操作算法:make_dheap(原位构造双端堆)、push_dheap(插入元素)、pop_max_dheap(删除最大元素)、pop_min_dheap(删除最小元素),is_dheap(堆验证),每个算法都提供<小于运算符和仿函数比较2个版本,要注意的是比较必须是严格 阅读全文
posted @ 2011-10-05 13:24 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:在《基于双端堆实现的优先级队列(1):原理》一文中讲述了双端堆的相关原理,本文则详细讲述具体的内部实现,便于区分,内部函数名称都以双下划线作为前缀,在这里,有几个关键问题需要说明 1)怎么求一个结点的对称结点:如果完全二叉树根结点从索引1开始但不存储元素,那么最小堆根结点则在索引2,最大堆根结点则在 阅读全文
posted @ 2011-10-03 17:54 cq12yue 阅读(0) 评论(0) 推荐(0)
摘要:前言 众所周知,stl中的优先级队列是基于最大堆实现的,能够在对数时间内插入元素和获取优先级最高的元素,但如果要求在对数时间内还能获取优先级最低的元素,而不只是获取优先级最高的元素,该怎么实现呢?可以用最大堆-最小堆或双端堆数据结构来实现,最大堆-最小堆和双端堆都是支持双端优先队列的插入、删除最小元 阅读全文
posted @ 2011-10-03 17:53 cq12yue 阅读(0) 评论(0) 推荐(0)