IOCP&WSARecv

在连续的几个WSARecv之后关闭客户端,这时IOCP有可能不会返回所有WSARecv发起的重叠操作。这真TMD蛋疼,我在这问题上调试了很长时间,并不是每次都出现。 有一种情况WSARecv发起重叠操作而IOCP不返回,那就是客户端异常(拔网线,烧机器等等)。在正常情况下客户端断开连接IOCP会返回一个0字节接收。但是多个WSARecv发起的重叠操作在极少数情况下还是有几个不会返回0字节接收,这时就卡在那了,我去你个╮(╯_╰)╭。 由此我猜测,这几个卡在那的WSARecv和客户端异常断开情况类似,解决方法就是直接closesocket。 到目前为止使用close...
杂记 | 2012-01-05 23:19 | 阅读 1660 次 | 评论 1 条

关于多线程的一些龌龊事

2009.11.27 写的   与信号量、互斥等内核对象比起来线程内核比较龌龊,它在创建时具有2次计数。在《windows核心编程》中说过,如果不需要线程的句柄则可以关闭该句柄(这时递减一次计数),线程在自然结束时还会自动递减一次计数,这样线程内核对象就被系统回收了。今天,我在写多线程时,发现了许多应该注意的问题。 一、我在这关闭线程句柄为什么不行? for (int i = 0; i < 10; ++i) {   HANDLE thread = (HANDLE)::_beginthreadex(Null, 0, &amp;WorkerThread, param, 0...
Windows | 2011-12-15 23:02 | 阅读 1050 次 | 评论 0 条

学习C++0x之右值引用

1、具名的右值引用将退化成左值 Rvalue&amp;&amp; r = Rvalue(); // r 是一个左值,虽然它被声明为右值引用。 // 在这样的情况下 r 如同一个局部对象:Rvalue r; void Fun(Rvalue&amp;&amp; _r) // _r 也是一个左值,你可以取它地址,但这是一个危险动作。{ Rvalue t = _r; // 不会调用 Rvalue(Rvalue&amp;&amp;) 转移构造函数,而是调用} // Rvalue(const Rvalue&amp;) 复制构造函数。 2、不能把右值引用绑定到左值,但是强制转换可以打破...
c++ | 2011-12-05 23:26 | 阅读 1101 次 | 评论 0 条

C++高级话题——重载operator delete的问题【积木网】

我觉得很不错,推荐一下。原文出处点击这里问题:想做一个内存管理,现在想到的方法是,做一个基类CMemMngr,在这个基类里重载了operator new/delete,然后让我的类都从这个基类里继承,以达到管理内存的目的。但是我需要在分配和释放内存时由用户提供一些额外的信息(比如int fIndex),于是定义了如下的operator new void* CMemMngr::operator new(size_t n, int fIndex) 这样是可以work的, CXX *p = new (1) CXX;其中CXX是CMemMngr的继承类 但是对于operator delete,如...
c++ | 2011-11-11 20:33 | 阅读 1610 次 | 评论 0 条

不得不说的一些编程技巧二

当我第一次看到使用一个字符串描述类型来创建对象时觉得很稀奇,我在猜想,是不是内部使用超多的case,通过判断字符串来创建对应的对象。但是这样的情况是静态的,所有的字符串都已经被预置了,当有一个新的类型出现,那么怎么又神奇的扩展了呢?伪代码如下:Animal *dog = Animal::Create (“Dog”); // 使用字符串创建Dog类型的Animal实例。Animal *cat = Animal::Create(“Cat”); // 同上 如果Animal::Create不能修改,那么怎么让它能够创建Fish类型的Animal呢?所有的这...
c++ | 2011-10-28 22:35 | 阅读 1310 次 | 评论 1 条

不得不说的一些编程技巧

一个人会一门语言不难,难的是会玩出花样,这就是技巧,当然玩的人多了这些技巧也就不怎么稀奇了,哈。 我就先说说一个叫“引用计数”的东西。顾名思义,就是记录一个对象被引用了几次。那么它的出发点是什么,这可能需要一个场景来描述。假设你有一个叫A的对象,在T1线程中被创建,之后可能会在T2线程或者T3线程中被使用。当然对象A是线程安全的,可以再任何线程中被安全使用,但问题是对象A该由谁来销毁?假如说T1和T2已经不需要使用对象A了,它们想留给T3线程来销毁,因为T3线程可能还在使用。这都是假设,反过来T3线程可能也不需要使用对象A了,那么它怎么知道T1和T2线程也不...
c++ | 2011-10-27 21:56 | 阅读 1507 次 | 评论 10 条

Jinlog 之 LogLevel 的实现

Jinlog是我对Log4cplus进行仿制的一个项目,现在我说说我的LogLevel实现方案。 在log4cplus中LogLevel实际上是int类型的别名,并且定义了一些常用的日志级别。按照日志事件程度,最低的日志级别为TRACE_LOG_LEVEL,意味着这是追踪式的日志,会有频繁的日志事件。最高的日志级别为FATAL_LOG_LEVEL,意味着这是非常严重的日志,基本上该日志事件在人品很差的情况下出现。另外还有开关式的日志级别,不作为日志事件来使用,那就是OFF_LOG_LEVEL和NOT_SET_LOG_LEVEL。所有这些日志级别都有一个常量值,比如OFF_LOG_...
系统辅助 | 2011-10-24 21:37 | 阅读 1064 次 | 评论 0 条

蛋疼的log4cplus源代码

在一个夜黑风高的深夜,我发现我的程序少了一样东西,一个用来记录程序运行过程和状态的东西。呃,是日志系统。所以我去网上搜索了一番,发现有好多开源的日志系统:log4cplus、log4C、log4cxx等等。经过比较我觉得log4cplus比较符合我的口味,因此下载了log4cplus的源代码。 对刚入手的log4cplus一筹莫展,据网上的教程说log4cplus具有以下几个元素:hierarchy、appender、logger、layout、filter、loglevel和loglog等等。另外log4cplus支持读取配置文件来动态创建各个元素。这的却很诱人,但是网上的...
系统辅助 | 2011-10-23 22:10 | 阅读 4470 次 | 评论 0 条
浏览13770次