typelist的用途 曾几何时,在搜索引擎里反复搜索typelist的用途,试图理解loki里这个“火星的生产力”,但终无所获。 今天,终于理解了火星的生产力是个什么东西,这真的是地球上没有的东西耶。 给曾经像我一样迷茫的人指一条路吧:如果你真的想不到typelist的用途,那是因为确实没
代码的持续可用性 代码的可维护性这个话题已经提了很多年了,但从最好的方案其实只是最适合自己的方案的角度思考,代码的可维护性说成代码的持续可用性更现实,更适合我们的目标。代码的持续可用性说的是今天写的代码可以适用未来的需求,相同的工作不需要重复做。但是,明眼人看到这里肯定会笑了,这是一个看起
软件工程的特点 从字面上来说,软件工程是一种工程,但从圈里的人的体会来说,软件工程是很有特点的一种工程:你有很多方案到达终点,而这些方案中没有好坏之分。找的一个方案往往不是太难,一个被找到的方案肯定不是错的,但是,找到一个真正适合你的方案却比较难。 软件工程是一种寻找最合适自己方
双向容器 有时候,解决问题的方法只是简单的换一下思维。 曾经有段时间我特别喜欢id号这个东西,那个时候的程序里可以看到各种各样“有明确意义”的索引,指针、字符串最常见,现在翻番那个时候的东西,觉得很幼稚很天真丷丷,闲来没事做一些优化,碰到了一个双向查找的问题,有时候我需要使用key找value,有时候又需要通过value找特定的key,其实很简单,真有这种需求的话做两个哈希表互相颠倒key-val
ACE_Proactor框架代码简析 这个框架里涉及了ACE_Handler相关继承体系里的几个类,我只是随需查看。1.ACE_Proactor(以及ACE_WIN32_Proactor——the Impl) ACE_Proactor需要桥接ACE_Proactor_Impl,在win32上,这个ACE_Proactor_Impl是完成端口的封装(服务器开发者们眼睛要绿的丷丷),也就是说,win32上的Proactor就
从应用层次探讨Reactor 操作系统已经提供了Reactor机制,核心表现是select方法。ACE的Reactor其实是对类select的操作系统方法的封装。 我这里都使用select方法举例讨论。 使用select方法,需要把socket压入FD_SET,使用select方法获取一次事件。在这个过程中,我们针对特定的事件进行反映,因此称为reactor。 ACE使用面对对象的思想对reactor进行了封
主流同步锁模式 优秀的模式具有通用性,因为它本书就是经验、优点的提炼、升华。 线程同步最大的问题是死锁问题,而白痴级的死锁是加锁后忘了释放或由于某种未考虑到的条件发生而导致无法释放。 类的构造函数、析构函数机制与C++栈上变量的生存法则结合,给了C++程序员无线的遐想(在这个基础上衍生出来的种种技巧到底是天使还是恶魔,我不去多想)。 ATL里主流CriticalSection封装类有两个,一
慎用TerminateThread using namespace yaogl;ThreadMutex g_mutex;void tellme(void* p){ for (int i = 0;i < 100; ++i) { ThreadAutoMutex mutex(g_mutex); printf("%d/n",i); }}
TcpClient、TcpListener和UdpClient以及数据转换 TcpClient、TcpListener和UdpClient是帮我们节省代码的类(封装类?丷丷,道理一样啦)。 TcpListener提供了AcceptSocket和AcceptTcpClient方法,TcpClient提供GetStream方法获取NetworkStream。对应udp协议有UdpClient。 BitConverter提供了数据类型转换帮助。
winsock缓冲的拆分包问题 逻辑上的一次发送未必就以一个单独的包发送出去,逻辑上的多次调用未必就是多个包被发送出去,这其中的秘密就是winsock缓冲区。调用flush可以强制发空当前缓冲数据,但是接收者还是未必一次收够或单次不多收。 使用NetworkStream可以在我们的程序中再设立一层缓冲,但真正的意义是在这层缓冲上,我们可以使用StreamReader和StreamWriter两个流,而这两个流可以使用R
C#网络编程之Hello World C++网络编程第一个程序恐怕都是sockaddr_in、socket、bind、listen、accept、recv/send、closesocket一套流程,C#一样可以这么做,而且还很有ACE类别封装的思想。 public static void Main(string[] args) { //sockaddr_in a
使用完成端口框架开发异步模块 完成端口模型可以让我们基于传递overlapped数据的思想分解异步操作,让操作系统帮我们做线程间的数据传递。基于这个思想,可以把bsdsocket改造成异步模型,尽管这样做效率上意义不大,但对于想模拟ms完成端口都网络模型的人来说,可以小圆梦想了。static HANDLE g_hiocp;static DWORD WINAPI worker(LPVOID pvd);
完成端口cookbook 在服务器开发上虚度日月久矣,每次新的开发都要重新写一遍netlayer,厌烦了这种事情想做一个类库给自己的时候,一直使用完成端口做网络层没有错,但是不去深刻理解完成端口的本质就不对了,而且在该使用这个强力工具的时候没有想起使用却是大大的错了。 cookbook只讲step by step创建一个完成端口模块(网络)。 意识到线程切换的巨大代价,NT小组开发了完成端口这个内核级的东西
GetQueuedCompletionStatus一直阻塞 使用WSASend或WSARecv投递相应的发送或接收请求后,始终没有收到相应返回通知,或者另外一个问题,在使用完成端口时,GetQueuedCompletionStatus一直阻塞,这都是由WSARecv或WSASend函数的调用参数未初始化造成的。 已经有好几次碰到这个问题了,出现问题调试出来才又一次的感觉到事情的严重性。要养成初始化参数的好习惯。
闲侃完成端口 ACE是个好东东,可是真正用的时候,我还是忍不住重新造车轮。做网络层的时候,考虑了一下还是自己做吧(并不是我觉得ACE不好或不方便,只是因为自己ACE不精,怕乱舞伤了自己)。 从好多方面来说,我都是c++的铁杆,自己给自己的评价是对c++有较深入的认识。不过因为闲时太喜欢做coding游戏,为了节省时间快速见效,投奔锐利c(c#,嘿嘿)了。扯远了,当用c#造车轮的时候,我想到了尽可能使用
Calling Managed .NET C# COM Objects from Unmanaged C++ Code C#创建、使用组件都非常简单,但像我这样的偏执狂自然想用C#创建一个传统的com server,终于找到了一篇文章,创建是可以不过比较麻烦,专用名词叫Calling Managed .NET C# COM Objects from Unmanaged C++ Code,简单试验了一下,我觉得,除非必须这样做,我再也不想用C#给C++写com了。 原文的地址是:http://www.cod
ATL中的线程安全(AC9) AC9,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第九部分。 ATL中的线程安全是由CXXXxxxCriticalSection提供的,使用的policy策略,使用者可以得到Lock、Unlock两个方法来处理同步问题,而且,ATL的诸多policy给使用者提供了恰好足够的线程安全。注意恰好足够的说法,也就是说首先它够用,更重要的是没有额外负担。
通过BEGIN_COM_MAP看接口的三剑客的实现和调用(AC8) AC8,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第八部分。 接口三剑客AddRef、Release、QueryInterface不用说了,他是在CComObjectRootEx中被实现的,但是调用过程却不是简单的依照虚函数路线向上查找到了这个类,而是由通过了系列宏BEGIN_COM_MAP。 已经说过,我们使用ATL向导添加的class不是最终的
各个类的协作关系(AC7) AC7,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第七部分。 这是张我自己分析ATL向导默认com代码画的一张图,有80多k,比较大,打不开也没关系,翻翻向导生成的代码自己也能感觉到。 发现图片竟然显示不全,无语了,这是图片地址。
聚合其他接口三部曲(AC6) AC6,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第六部分。 ATL向导可以帮我们生成可以被聚合的接口,但是如果一个接口要聚合其他接口,需要下面三个步骤。 1.定义IUnknown指针 2.在FinalConstruct中创建获取IUnknown指针,在FinalRelease中释放。 3.使用COM_INTERFACE_ENTRY