
C/C++
文章平均质量分 75
hjxhjh
这个作者很懒,什么都没留下…
展开
-
C/C++ Volatile关键词深度剖析
背景前几天,发了一条如下的微博 (关于C/C++ Volatile关键词的使用建议):此微博,引发了朋友们的大量讨论:赞同者有之;批评者有之;当然,更多的朋友,是希望我能更详细的解读C/C++ Volatile关键词,来佐证我的微博观点。而这,正是我写这篇博文的初衷:本文,将详细分析C/C++ Volatile关键词的功能 (有多种功能)、Volatile关键词在多线程转载 2014-08-11 17:12:39 · 608 阅读 · 0 评论 -
Linux中的同步机制 -- Futex
Linux中的同步机制(一)--Futex引子在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这个内核不一定能正确的运行使用glibc的程序",那futex是什么?和glibc又有什么关系呢?1. 什么是FutexFutex 是Fast Userspace muTexes的缩写,由Hubertus F转载 2013-08-29 09:17:18 · 706 阅读 · 0 评论 -
Perf -- Linux下的系统性能调优工具,第 2 部分
本文内容简介之前介绍了 perf 最常见的一些用法,关注于 Linux 系统上应用程序的调优。现在让我们把目光转移到内核以及其他 perf 命令上面来。在内核方面,人们的兴趣五花八门,有些内核开发人员热衷于寻找整个内核中的热点代码;另一些则只关注某一个主题,比如 slab 分配器,对于其余部分则不感兴趣。对这些人而言,perf 的一些奇怪用法更受欢迎。当然,诸如 perf top,转载 2013-08-27 10:36:04 · 1197 阅读 · 0 评论 -
Perf -- Linux下的系统性能调优工具,第 1 部分
Perf 简介Perf 是用来进行软件性能分析的工具。通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈。最初的时候,它叫做 Performance counter,在 2.转载 2013-08-27 10:32:44 · 984 阅读 · 0 评论 -
浅谈TCP/IP网络编程中socket的行为
我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉:1. TCP/IP协议(如连接的建立和终止、重传和确认、滑动窗口和拥塞控制等等)2. Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为。3. 编写Performant, Scalable的服务器程序。包括多线程、IO Multiplexing、转载 2013-08-13 08:55:42 · 877 阅读 · 0 评论 -
如何用Java程序改变系统环境变量
首页业界资讯软件教程软件下载硬件频道家电频道开发编程源码下载游戏频道手机软件IT资讯互联网IT业界电信· 3G网站推荐互联思考深度报道电子商务职场创业资料数据常用软件操作系统聊天软件病毒安全办公软件硬件数码手机使用笔记本装机配件数码相机精品下载APP下载冲浪宝典新闻频道开发编程JAVA 全部 资讯 下载转载 2013-08-11 17:07:00 · 3850 阅读 · 0 评论 -
Linux socket关闭连接shutdown与close
在Linux socket关闭连接的方法有两种分别是shutdown和close,首先看一下shutdown的定义#includeint shutdown(int sockfd,int how);how的方式有三种分别是:SHUT_RD(0):关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。SHUT_WR(1):关闭sockfd的写功能,此选项将不允许sock转载 2013-08-22 18:38:04 · 3851 阅读 · 0 评论 -
JAVA基础之理解JNI原理
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。在此总结了下面这个知识图:实例:环境说明:ubuntu 10.4.2 LTS系统程序清单1:src/com/magc/jni/H转载 2013-08-11 17:21:50 · 632 阅读 · 0 评论 -
linux网络编程之socket(十):shutdown 与 close 函数 的区别
假设server和client 已经建立了连接,server调用了close, 发送FIN 段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过socket发送和接收数据,此时client调用read,如果接收到FIN 段会返回0,但client此时还是可以write 给server的,write调用只负责把数据交给TCP发送缓冲区就可以成功返回了,所以不会出转载 2013-08-22 19:03:07 · 4694 阅读 · 0 评论 -
Mutex和内存可见性
介绍POSIX线程遵守共享内存模型[1],此模型各线程可以访问一组共享对象。多个并发的线程需要协同访问共享对象。为此该模型引入了以下两个属性来简化程序设计:原子访问:避免线程在访问数据对象时,另一线程正在修改它。 内存可见性:一旦线程修改数据对象,其它线程在修改行为发生之后马上能看见此对象的新状态,如图1所示。Mutex通常被引进作为实现原子访问的手段,但它的作用不仅仅是用转载 2013-07-26 20:13:23 · 1090 阅读 · 0 评论 -
c 语言宏的妙用(用法技巧)
Preprocessor OperatorsFour preprocessor-specific operators are used in the context of the #define directive (see the following list for a summary of each). The stringizing, charizing, and to转载 2013-07-31 12:27:43 · 1422 阅读 · 0 评论 -
c 语言可变参数
1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表void foo(...);void foo(parm_list,...); 2:函数参数的传递原理函数参数是以数据结构:栈的形式存取,从右至左入栈.eg:#include void fun(int a, ...){int *temp = &a;temp++;for (int转载 2013-07-30 15:37:39 · 688 阅读 · 0 评论 -
线程安全与可重入函数
线程安全: 线程安全函数:在C语言中局部变量是在栈中分配的,任何未使用静态数据或其他共享资源的函数都是线程安全的。 使用全局变量的函数是非线程安全的。 使用静态数据或其他共享资源的函数,必须通过加锁的方式来使函数实现线程安全。 线程安全的(Thread-Safe):转载 2013-07-22 11:25:55 · 744 阅读 · 0 评论 -
epoll的两种触发模式
linux异步IO浅析 http://hi.baidu.com/_kouu/blog/item/e225f67b337841f42f73b341.html epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在采用这两种模式时要注意的是,如果采用ET模式,那么仅当状态发生变化时才会通知,而采用LT模式类似于原来的select/转载 2013-07-18 23:55:11 · 22309 阅读 · 1 评论 -
zookeeper 工作原理
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。Zookeeper是hadoop的一个子项目,其发展历程无需赘述。在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。Zookee转载 2013-07-12 14:36:00 · 694 阅读 · 0 评论 -
exit、return、_exit、_Exit这几个函数的区别
1、exit函数和return函数的主要区别是:1)exit用于在程序运行的过程中随时结束程序,其参数是返回给OS的。也可以这么讲:exit函数是退出应用程序,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息。main函数结束时也会隐式地调用exit函数,exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭转载 2013-07-13 11:17:02 · 935 阅读 · 0 评论 -
由浅入深探究mysql索引结构原理、性能分析与优化
(好文章:转自:http://www.phpben.com/?post=74)第一部分:基础知识:索引官方介绍索引是帮助MySQL高效获取数据的数据结构。笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里,不用一页一页查阅找出需要的资料。关键字index------------------------------------------------------------转载 2013-07-10 19:27:14 · 588 阅读 · 0 评论 -
linux c 进程跟踪工具:strace、ltrace、truss
strace命令详解strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用。 strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。 下面记录几个常用 option . 1 -f -F选项告诉strace同时跟踪fork和vfork出来的进程 2 -o xxx.txt 输出到某个文转载 2014-02-28 15:56:17 · 1403 阅读 · 0 评论 -
位运算总结及应用
一、C语言的六种位运算符:& 按位与| 按位或^ 按位异或~ 取反左移>> 右移 1. 按位与运算按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。例如:9&5可写算式如下: 00001001 (9的二进制补码)&0000010转载 2014-01-17 12:12:32 · 749 阅读 · 0 评论 -
高性能网络编程六--reactor反应堆与定时器管理
反应堆开发模型被绝大多数高性能服务器所选择,上一篇所介绍的IO多路复用是它的实现基础。定时触发功能通常是服务器必备组件,反应堆模型往往还不得不将定时器的管理囊括在内。本篇将介绍反应堆模型的特点和用法。首先我们要谈谈,网络编程界为什么需要反应堆?有了IO复用,有了epoll,我们已经可以使服务器并发几十万连接的同时,维持高TPS了,难道这还不够吗?我的答案是,技术层面足够了,但在软件转载 2013-12-26 18:24:56 · 833 阅读 · 0 评论 -
Raw Socket和Socket编程
1.原始套接字(raw socket) 1.1 原始套接字工作原理与规则 原始套接字是一个特殊的套接字类型,它的创建方式跟TCP/UDP创建方法几乎是一摸一样,例如,通过CODE:[Copy to clipboard] int sockfd; sockfd = socktet(AF_INET, SOCK_转载 2013-12-11 09:33:42 · 14676 阅读 · 0 评论 -
内存管理机制
为什么必须管理内存内存管理是计算机编程最为基本的领域之一。在很多脚本语言中,您不必担心内存是如何管理的,这并不能使得内存管理的重要性有一点点降低。对实际编程来说,理解您的内存管理器的能力与 局限性至关重要。在大部分系统语言中,比如 C 和 C++,您必须进行内存管理。本文将介绍手工的、 半手工的以及自动的内存管理实践的基本概念。追溯到在 Apple II 上进行汇编语言编程的时代,转载 2013-11-12 09:37:10 · 915 阅读 · 0 评论 -
Linux 的多线程编程的高效开发经验
背景Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别。不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断。本文中我们从 5 个方面总结出 Linux 多线程编程上的问题,并分别引出相关改善的开发经验,用以避免这些的陷阱。我们希望这些经验可以帮助读者们能更好更快的熟悉 Linux 平台的多线程编程。转载 2013-11-21 11:14:42 · 889 阅读 · 0 评论 -
高性能网络编程(一)----accept建立连接
最近在部门内做了个高性能网络编程的培训,近日整理了下PPT,欲写成一系列文章从应用角度谈谈它。编写服务器时,许多程序员习惯于使用高层次的组件、中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发的效率,追求更快的完成项目功能点、希望应用代码完全不关心通讯细节。他们更喜欢在OO世界里,去实现某个接口、实现这个组件预定义的各种模式、设置组件参数来达到目转载 2013-09-01 10:42:50 · 929 阅读 · 0 评论 -
高性能网络编程(四)---- tcp 连接的关闭
TCP连接的关闭有两个方法close和shutdown,这篇文章将尽量精简的说明它们分别做了些什么。为方便阅读,我们可以带着以下5个问题来阅读本文:1、当socket被多进程或者多线程共享时,关闭连接时有何区别?2、关连接时,若连接上有来自对端的还未处理的消息,会怎么处理?3、关连接时,若连接上有本进程待发送却未来得及发送出的消息,又会怎么处理?4、so_linger这个功能的转载 2013-11-06 14:56:06 · 884 阅读 · 0 评论 -
高性能网络编程(二)----TCP消息的发送
在上一篇中,我们已经建立好的TCP连接,对应着操作系统分配的1个套接字。操作TCP协议发送数据时,面对的是数据流。通常调用诸如send或者write方法来发送数据到另一台主机,那么,调用这样的方法时,在操作系统内核中发生了什么事情呢?我们带着以下3个问题来细细分析:发送方法成功返回时,能保证TCP另一端的主机接收到吗?能保证数据已经发送到网络上了吗?套接字为阻塞或者非阻塞时,发送方法做的事情有何不转载 2013-09-01 11:11:04 · 1383 阅读 · 0 评论 -
Memcached 学习的感想
很早就想看看memcached的源代码,比较关系其多线程处理模型、内存管理机制。由于各种原因,都没有实施。今天抽时间看了一下,主要是看了多线程模型部分。觉得有两篇博客介绍还是比较全面的,对于学习还是很有帮助的。Memcached源码分析(线程模型): 讲的比较全面,但是感觉贴的代码有点多(数据结构的代码)。memcache 线程模型。总体下来觉得:1. 基于libevent 实原创 2013-11-16 17:43:10 · 710 阅读 · 0 评论 -
__attribute__机制介绍
1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)__attribute__前后都有两个下划线,并且后面会紧跟一对原括弧,括弧里面是相应的__attrib转载 2013-10-31 18:39:52 · 544 阅读 · 0 评论 -
extern 关键字详解
基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是转载 2013-10-22 11:22:46 · 945 阅读 · 0 评论 -
c++ 项目中的extern c
引言在用C++的项目源码中,经常会不可避免的会看到下面的代码:?123456789#ifdef __cplusplusextern"C" { #endif /*...*/ #ifdef __cplusplus} #endif它到底转载 2013-10-22 11:23:17 · 678 阅读 · 0 评论 -
深入理解Linux用户空间的锁机制
1. 缘起 随着SMP(Symmetrical Multi-Processing)架构的流行和epoll类系统调用对非阻塞fd监视的支持,高性能服务器端的开发已经能够实现CPU计算和IO的分离。为了充分发挥CPU的计算能力,服务器端的设计必须要尽量减少线程切换。引起线程切换最重要的原因之一就是对mutex和semaphor等锁的使用。本文从计算机体系架构、操作系统的转载 2013-09-21 21:05:33 · 2419 阅读 · 0 评论 -
高性能网络编程(三)----TCP消息的接收
这篇文章将试图说明应用程序如何接收网络上发送过来的TCP消息流,由于篇幅所限,暂时忽略ACK报文的回复和接收窗口的滑动。为了快速掌握本文所要表达的思想,我们可以带着以下问题阅读:1、应用程序调用read、recv等方法时,socket套接字可以设置为阻塞或者非阻塞,这两种方式是如何工作的?2、若socket为默认的阻塞套接字,此时recv方法传入的len参数,是表示必须超时(SO_RC转载 2013-09-02 09:21:59 · 1147 阅读 · 0 评论 -
Effective C++和More Effective C++
More Effective C++读书笔记条款1:指针与引用的区别二者之间的区别是:在任何情况下都不能用指向空值的引用,而指针则可以;指针可以被重新赋值以指向另一个不同的对象,但是引用则总是指向在初始化时被指定的对象,以后不能改变在以下情况下使用指针:一是存在不指向任何对象的可能性;二是需要能够在不同的时刻指向不同的对象在以下情况使用引用:总是指向一个对象且一旦指向一个对转载 2013-07-10 19:36:45 · 781 阅读 · 0 评论 -
InnoDB Memcached Plugin源码实现调研
MySQL 5.6版本,新增了一个NoSQL的接口,通过将memcached嵌入到MySQL系统之中,用户可以直接使用memcached接口直接操作MySQL中的InnoDB表,绕过MySQL Server层面的SQL解析,优化,甚至绕过InnoDB Handler层,直接操作InnoDB内部的方法,从而达到更优的响应时间与效率。关于此功能的官方介绍,请见:InnoDB Integration转载 2013-07-10 19:29:52 · 984 阅读 · 0 评论 -
epoll 边缘触发学习
在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:#define __转载 2013-06-19 12:18:00 · 714 阅读 · 0 评论 -
函数指针与指针函数
在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。1.函数指针定义函数类型 (*指针变量名)(形参列表);“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量转载 2012-07-07 12:16:01 · 418 阅读 · 0 评论 -
声明与函数、函数指针
概述 在很多情况下,尤其是读别人所写代码的时候,对 C语言声明的理解能力变得非常重要,而C语言本身的凝练简约也使得C语言的声明常常会令人感到非常困惑,因此,在这里我用一篇的内容来集中阐述一下这个问题。 问题:声明与函数 有一段程序存储在起始地址为 0的一段内存上,如果我们想要调用这段程序,请问该如何去做? 答案 答案是 (*(void转载 2012-07-07 12:15:05 · 343 阅读 · 0 评论 -
linux 守护进程
守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实转载 2012-05-31 09:25:27 · 363 阅读 · 0 评论 -
深入解析C++中的string类
<br />一,C语言的字符串<br />在C语言里,对字符串的处理一项都是一件比较痛苦的事情,因为通常在实现字符串的操作的时候都会用到最不容易驾驭的类型——指针。<br />比如下面这个例子:<br />//example 1:<br />char str[12] = "Hello";<br />char *p = str;<br />*p = ''h''; //改变第一个字母<br /> <br />//example 2:<br />char *ptr = "Hello"; <br />*ptr =转载 2011-05-06 20:17:00 · 855 阅读 · 0 评论 -
C++ 拷贝控制
<br /> 本文主要讨论C++类定义中的拷贝控制(copy control):拷贝构造函数、赋值操作符和析构函数。 如果文中有错误或遗漏之处,敬请指出,谢谢! C++类中有四个不可或缺的部分,那就是构造函数、拷贝构造函数、赋值操作符和析构函数。如果类中没有定义这些函数,那么编译器将为类自动生成这些函数。当然,你也可以通过private控制策略限定不使用拷贝构造函数和赋值操作符。 其中,拷贝构造函数、赋值操作符和析构函数总称为拷贝控制(copy control)。 当类中有指针类转载 2011-04-18 08:34:00 · 1322 阅读 · 0 评论