Linux后台服务器编程。
发布时间:2014-08-07 17:38:53
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP.........【阅读全文】
发布时间:2014-08-07 11:41:33
近来网站随着访问量的增加,服务器的压力也随之上升,一个很明显的状况便是服务端产生了大量的TIME_WAIT状态,它究竟是什么、对系统有何影响、为什么很多人对它如此敏感? Google一下TIME_WAIT会有成千上万的文章,但总是别人的,今天自己整理一下对TIME_WAIT的认识。 TCP连接的终止 TCP建立一个连接.........【阅读全文】
发布时间:2014-08-06 17:09:45
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。面向过程的static静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下://Example.........【阅读全文】
发布时间:2014-08-05 17:12:31
构造函数派生类的对象的数据结构是由基类中说明的数据成员和派生类中说明的数据成员共同构成。将派生类的对象中由基类中说明的数据成员和操作所构成的封装体称为基类子对象,它由基类中的构造函数进行初始化。 构造函数不能够被继承,因此,派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象。所以,在.........【阅读全文】
发布时间:2014-08-05 10:53:56
如今,但凡说精通网络的,第二个意思就是“精通TCP”,事实上,很多自称精通TCP的家伙们只是精通socket接口而已,对TCP行为精通的并不多,笔者也不算精通,但绝对是中等以上水平。如果你真的精通TCP行为,那么本文不读也罢,直接发邮件给我,我们切磋一下,如果只是了解socket接口,那么建议读本文,然后一定再看一下《TCP.........【阅读全文】
发布时间:2014-08-05 10:52:37
说明:1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人。因为本文不会解析TCP头里面的每一个字段或者3次握手的细节,也不会解释慢启动和快速重传的定义4).除了《TCP/IP详解》(.........【阅读全文】
发布时间:2014-08-04 12:05:27
queue和list的结构定义和操作都在'sys/queue.h'中完成, 主要定义了下面四种数据结构:单向列表(single-linked lists)单向尾队列(single-linked tail queue)列表(lists)尾队列(tail queues)尾队列图示 尾队列常用宏宏名称.........【阅读全文】
发布时间:2014-08-04 08:43:27
最近项目组中有个同事使用epoll+多线程实现了一个简单的服务器,但是经过压测后,发现如果使用边缘触发模式的话,就会出现丢包现象,水平触发设置等待时间确实解决了丢包问题,但却影响了服务器的性能。所以我就写了一个epoll+多进程的模型,代码如下:#include <sys/socket.h> #include <sys/epoll.h> .........【阅读全文】
发布时间:2014-08-03 21:34:44
Client:#include <sys/stat.h>#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <netdb.h>#include <fcntl.h>#include <unistd.h>#include <netinet/in.h>#include &nb.........【阅读全文】
发布时间:2014-08-03 17:02:00
自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。 由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。 信号量和读.........【阅读全文】
发布时间:2014-08-03 11:41:35
va_start和va_end使用详解 本文主要介绍va_start和va_end的使用及原理。 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我.........【阅读全文】
发布时间:2014-08-02 09:59:52
什么线程池,为什么要使用线程池?下面是一个比喻。阶段一、一个医院,每天面对成千上万的病人,处理方式是:来一个病人找来一个医生处理,处理完了医生也走了。当看病时间较短的时候,医生来去的时间,显得尤为费时了。阶段二、医院引进了线程池的概念。设置门诊,把医生全派出去坐诊,病人来看病先挂号排队,医.........【阅读全文】
发布时间:2014-08-02 09:00:07
我设计这个线程池的初衷是为了与socket对接的。线程池的实现千变万化,我得这个并不一定是最好的,但却是否和我心目中需求模型的。现把部分设计思路和代码贴出,以期抛砖引玉。个人比较喜欢搞开源,所以大家如果觉得有什么需要改善的地方,欢迎给予评论。思前想后,也没啥设计图能表达出设计思想,就把类图贴出来吧。.........【阅读全文】
发布时间:2014-08-01 21:14:09
对一个进程预定义了三个流,并且这三个流可以自动的被进程使用,它们是:标准输入、标准输出、和标准错误。标准I/O库提供缓冲的目的是尽可能减少使用read和write的次数。标准I/O库提供了三种类型的缓冲:1、全缓冲:在填满标准I/O缓冲区后进行实际I/O操作。对于驻留.........【阅读全文】
发布时间:2014-08-01 20:20:00
1、C标准库的I/O缓冲区 UNIX的传统是Everything is a file, 键盘、显示器、串口、磁盘等设备在/dev 目录下都有一个特殊的设备文件与之对应,这些设备文件也可以像普通文件(保存在磁盘上的文件)一样打开、读、写和关闭,使用的函数接口是相同的。 用户程序调用C标准I/O库函数读写普通文件或设备,而这.........【阅读全文】
发布时间:2014-08-01 15:34:43
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来.........【阅读全文】
发布时间:2014-07-31 17:44:55
我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。本文主要通过举例来说明在Linux中如何创建静.........【阅读全文】
发布时间:2014-07-31 17:07:43
在空白的文本编辑器里打开一个崭新的文本,没有一行代码,出现在眼前的是一个充满了无限可能和希望的项目。可是,当数千行的代码写完之后,整个项目因为bug的出现而被压垮了,更别说添加什么新功能了...这也许是对程序员的最大打击,在饱满的热情上浇了一盆冷水。其实,最好的软件程序员当然知道怎样去发现并修复这些bug.........【阅读全文】
发布时间:2014-07-31 15:39:17
[-]概念理解Linux下的五种IO模型阻塞IO模型非阻塞IO模型IO复用模型信号驱动IO异步IO模型个IO模型的比较selectpollepoll简介socket阻塞与非阻塞,同步与异步作者:huangguisu.........【阅读全文】
发布时间:2014-07-31 11:06:32
包含文件:#ifndef __TIME_T#define __TIME_T /* 避免重复定义 time_t */typedef long time_t; /* 时间值time_t 为长整型的别名*/#endif 既然time_t实际上是长整型,到未来的某一天,从一.........【阅读全文】
发布时间:2014-07-30 21:44:42
变量定义与声明的区别我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下: 变量的声明有两种情况: (1) 一种是需要建立存储空间的(定义、.........【阅读全文】
发布时间:2014-07-30 21:40:42
在写 头文件的时间 经常会有一些 class QFile 等这类 看似 是声明的东西..例如下面#ifndef WINDOW_H#define WINDOW_HQT_BEGIN_NAMESPACEclass QTcpServer;class QTcpSocket;class QProgressBar;class QLabel;class QDialogButtonBox;class QFile;QT_END_NAMESPACE//code endclass QAction;class Q.........【阅读全文】
发布时间:2014-07-30 09:45:35
转载请注明出处,声明如下:作者:peizhongyou原文地址:http://hi.baidu.com/pub/show/modifytext?qbid=0f96a73fe72477ad623aff67前几天参加一个编程竞赛,涉及到部分位运算的知识,准备不足挂了。事后在网上搜了一下位运算的介绍看到《位运算之美》这篇博客,其中提到了一个题目“不许用%和/来实现求任意.........【阅读全文】
tianyashuibin2014-12-08 11:22
Oscarzhao:c++11 中貌似可以
嗯,是的,在c++11中可以
下面是在gcc的编译结果:
test_struct.cc:8:11: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
int a = 1;
^
tianyashuibin2014-10-23 21:57
除了静态数据成员外,数据成员不能在类体内显式的初始化
举个最简单例子
struct a
{
int a=1;
int b=2;
};
这也不能通过啊!
原因很简单,因为struct a此时只是在说明有这么个类型,而并没有定义一个具体的变量和分配内存空间
tianyashuibin2014-10-23 21:39
1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
2.进入构造函数后在构造函数中执行一般计算
1.类里面的任何成员变量在定义时是不能初始化的。
2.一般的数据成员可以在构造函数中初始化。
3.const数据成员必须在构造函数的初始化列表中初始化。
4.static要在类的定义外面初始化。
5.数组成员是不能在初始化列表里初始化的。
6.不能给数组指定明显的初始化。
这6条一起,说明了一个问题:C++里面是不能定义常量数组的!因为3和5的矛盾。
tianyashuibin2014-10-23 21:32
记住静态成员这样初始化:
C/C++ code
class A
{
public:
static const int a[3];
};
const int A::a[3] = {1,2,3};