摘要: /************************************************************************** Event 事件** 同步机制中最富有弹性的机制了。唯一的目的就是成为激发状态或未激发状态** 而这两种状态完全由程序控制。所以你可以精确告诉一个Event对象做什么事** 以及什么时候去做。** ** 主要函数:** CreateEvent** OpenEvent** SetEvent** ResetEvent** PulseEvent** 参考资料** http://www.codeproject.com/Articles/438/Intr 阅读全文
posted @ 2012-08-17 14:19 木愚 阅读(228) 评论(0) 推荐(0) 编辑
摘要: /************************************************************************** Semaphore 信号量** 可以将Mutex看作Semaphore的简化版,Mutex锁住的是一份资源,** Semaphore锁住的是多份资源,可以让多个线程在“同一时间同时运行”** ** 主要函数:** CreateSemaphore** ReleaseSemaphore** VS2008 MSND的例子** ms-help://MS.MSDNQTR.v90.en/dllproc/base/createsemaphore.htm*** 阅读全文
posted @ 2012-08-17 10:19 木愚 阅读(274) 评论(0) 推荐(0) 编辑
摘要: /************************************************************************** Mutex 互斥器** 学习Mutex和WaitForSingleObject一起使用的方法** ** 主要函数:** CreateMutex** OpenMutex** ReleaseMutex** Mutex可以跨进程使用,用途之一防多开************************************************************************/#include <iostream>#incl 阅读全文
posted @ 2012-08-16 15:07 木愚 阅读(459) 评论(0) 推荐(0) 编辑
摘要: /************************************************************************** Critical Section 临界区** 这是一种防止多个线程同时执行一个特定代码节的机制。** 临界区是一种轻量级机制,在某一时间内只允许一个线程执行某个给定代码段。** 通常在修改全局数据(如集合类)时会使用临界区。Event、Mutex和Semaphore也用于多线程同步,但临界区与它们不同,** 它并不总是执行向内核模式的控制转换,这一转换成本昂贵。稍后将会看到,要获得一个未占用临界区,** 事实上只需要对内存做出很少的修改,其速度 阅读全文
posted @ 2012-08-14 17:17 木愚 阅读(355) 评论(0) 推荐(0) 编辑
摘要: 实话实说,模板用得特别少,语法上的使用都相当生疏。#include <iostream>using namespace std;#include <string>#include <vector>// 一个简单的加法模板template<class T>class Addition{public: T fun( T a, T b ) { return ( a + b ); }};/*** 特化1** 类模板特化(specialization)** 特化之前需要有类模板的声明*/template<>class Addition<c 阅读全文
posted @ 2012-05-31 21:27 木愚 阅读(2406) 评论(0) 推荐(1) 编辑
摘要: 之所以将指针用引号表示,是因为成员函数“指针”不是指针!还是让代码来说话。#include <iostream>using namespace std;// 父类Aclass A{public: int funA() { return 2; }};// 父类Bclass B{public: int funB() { return 3; }};// 单继承class C : public A{public: int funC() { return 4; }};// 多重继承class D : public A, public B{public: int funD() {... 阅读全文
posted @ 2012-05-30 20:45 木愚 阅读(560) 评论(0) 推荐(0) 编辑
摘要: #include <iostream>using namespace std;class A{public: A() { cout << "A::this = " << this << endl; }; /*virtual*/ ~A() {} // virtual 1public: int a;};class B : /*virtual */public A // virtual 2{public: B() { cout << "B::this = " << this << 阅读全文
posted @ 2012-05-29 17:11 木愚 阅读(642) 评论(0) 推荐(0) 编辑
摘要: 在之前聊了小括号重载和回调函数,现在来聊聊仿函数,以及它和回调函数的关系。 仿函数是对象使用行为看上去像个函数。 函数的使用是这个样的 Function(param1,param2,...) 而对象的使用是这个样的 Object.memberfunction(param1,param2...) 而仿函数对象的使用是这个样的 Object(param1,param2,...) 这样我们可以看出,从外表上看,仿函数对象和函数是一个东西。呵呵,当然他们是不同的。他们一样不过是在使用的外形上一样罢了。#include <iostream>using namespace std;#i... 阅读全文
posted @ 2012-05-28 21:45 木愚 阅读(859) 评论(0) 推荐(0) 编辑
摘要: #include <iostream>using namespace std;typedef void (*CALLBACK)( int a, int b );class CBase{public: CBase();public: /* ** 注册回调函数 ** */ void RegisterCallback( CALLBACK fun, int k, int j ); /* ** 调用回调函数 ** */ void CallCallback();private: /* ** 成员变量: ** 分别保存回调函... 阅读全文
posted @ 2012-05-28 17:06 木愚 阅读(366) 评论(0) 推荐(1) 编辑
摘要: #include <iostream>using namespace std;int main(){ /* ** 脑海里要牢记:“*”是取地址内容的操作符,后面的值必须是个地址 ** int *p[2] ** 一维数组,数组大小为2,数组的元素是int的指针 ** 即数组中放的是int *的数据 */ int *p[2]; int a[3] = { 11, 21, 31 }; int b[4] = { 41, 51, 61, 71 }; //此时数组大小不限制 /* ** 注意不能使用p[2],否则数组越界 ** 如果... 阅读全文
posted @ 2012-05-22 21:26 木愚 阅读(245) 评论(0) 推荐(0) 编辑