自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

陈硕的Blog

吾尝终日而思矣,不如须臾之所学也。吾尝跂而望矣,不如登高之博见也。……君子生非异也,善假于物也。 @bnu_chenshuo

  • 博客(150)
  • 资源 (3)
  • 收藏
  • 关注

原创 Muduo 网络编程示例之六:限制服务器的最大并发连接数

Muduo 网络编程示例之六:限制服务器的最大并发连接数 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice  t.sina.com.cn/giantchen 这是《Muduo 网络编程示例》系列的第六篇文章。 Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/779646.aspx   本文已以大家都熟悉的 EchoServer 介绍如何限制服务器的并发连接数。 本文的代码见 http://c

2011-04-27 00:05:00 10221 8

原创 分布式程序的自动化回归测试

以单独的进程作为 test harness 对于开发分布式程序相当有帮助,它能达到单元测试的自动化程度和细致程度,又避免了单元测试对功能代码结构的侵入与依赖。

2011-04-25 00:28:00 14577 15

原创 “过家家”版的移动离线计费系统实现

看到一道热烈讨论的“移动用户资费统计系统”编程面试题,本文给出我的做法。 http://blog.csdn.net/zhangxiaoxiang/archive/2011/04/06/6304117.aspx 为避免版权纠纷,我这里就不引用原文了。   完整的代码见 https://github.com/chenshuo/recipes/tree/master/java/ 其中 billing/ 目录是 Java 代码,groovy/ 目录是计费规则。这份代码依赖 Groovy、JUnit、J

2011-04-22 15:16:00 5286 2

原创 Muduo 网络编程示例之五: 测量两台机器的网络延迟

Muduo 网络编程示例之五: 测量两台机器的网络延迟 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice  t.sina.com.cn/giantchen 这是《Muduo 网络编程示例》系列的第五篇文章。 Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/779646.aspx   本文介绍一个简单的网络程序 roundtrip,用于测量两台机器之间的网络延迟,即“往返时间 / round t

2011-04-20 09:27:00 11590 8

原创 Muduo 设计与实现之一:Buffer 类的设计

本文介绍 Muduo 中输入输出缓冲区的设计与实现。 本文中 buffer 指一般的应用层缓冲区、缓冲技术,Buffer 特指 muduo::net::Buffer class。 本文前两节的内容已事先发表在 muduo 英文博客 http://muduo.chenshuo.com/2011/04/essentials-of-non-blocking-tcp-network.html 。 如果文中的图形看不清楚,请移步 http://www.cnblogs.com/Solstice/archive/2

2011-04-17 12:26:00 33255 98

原创 模拟银行窗口排队叫号系统的运作

最近在网上看到了一道面试题,初看很简单,细看有点意思的一道题目: http://blog.csdn.net/zhangxiaoxiang/archive/2011/04/01/6294132.aspx 为避免版权纠纷,我这里就不引用原文了。   各人对题目的理解不一样,我把它当成一道离散事件仿真题目来做,用一个优先队列解决。 完整的代码见 https://github.com/chenshuo/recipes/tree/master/java/bankqueue 。 离散事件模拟 《数据结构》

2011-04-15 09:13:00 35058 68

原创 在 muduo 中实现 protobuf 编解码器与消息分发器

陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice  t.sina.com.cn/giantchen Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/779646.aspx 本文是《一种自动反射消息类型的 Google Protobuf 网络传输方案》的延续,介绍如何将前文介绍的打包方案与 muduo::net::Buffer 结合,实现了 protobuf codec 和 dispatcher。

2011-04-13 08:12:00 24570 36

原创 一种自动反射消息类型的 Google Protobuf 网络传输方案

这篇文章要解决的问题是:在接收到 protobuf 数据之后,如何自动创建具体的 Protobuf Message 对象,再做的反序列化。“自动”的意思是:当程序中新增一个 protobuf Message 类型时,这部分代码不需要修改,不需要自己去注册消息类型。其实,Google Protobuf 本身具有很强的反射(reflection)功能,可以根据 type name 创建具体类型的 Message 对象,我们直接利用即可。

2011-04-03 15:57:00 88049 117

原创 构建易于维护的分布式程序

陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 摘要:本篇博客没有新东西,只不过是把去年在珠三角技术沙龙做的一次演讲的其中一张 ppt 展开讲一讲。 本文标题中的“易于维护”指的是 supportability,不是 maintainability。前者是从运维人员角度说,程序管理起来很方便,日常的劳动负担小;后者是从开发人员的角度说,代码好读好改。 前文《分布式系统中的进程标识》我提到一个观点:分布式系统中的每个长期运行的、会与其他机器打交道的进程都应

2011-03-30 00:03:00 18796 15

原创 分布式系统中的进程标识

昨天跟朋友聊天,谈到了分布式系统中如何为进程取标识符(process identifier),写篇博客简单总结一下我的观点:以四元组 ip:port:start_time:pid 作为分布式系统中进程的全局唯一标识符(gpid)

2011-03-29 01:29:00 16334 47

原创 C++ 工程实践(5):避免使用虚函数作为库的接口

摘要:作为 C++ 动态库的作者,应当避免使用虚函数作为库的接口。这么做会给保持二进制兼容性带来很大麻烦,不得不增加很多不必要的 interfaces,最终重蹈 COM 的覆辙。 本文主要讨论 Linux x86 平台,会继续举 Windows/COM 作为反面教材。 本文是上一篇《C++ 工程实践(4):二进制兼容性》的延续,在写这篇文章的时候,我原本以外大家都对“以虚函数作为接口”的害处达成共识,我就写得比较简略,看来情况不是这样,我还得展开谈一谈。

2011-03-12 22:01:00 25414 110

原创 C++ 工程实践(4):二进制兼容性

陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 本文主要讨论 Linux x86/x86-64 平台,偶尔会举 Windows 作为反面教材。 C/C++ 的二进制兼容性 (binary compatibility) 有多重含义,本文主要在“头文件和库文件分别升级,可执行文件是否受影响”这个意义下讨论,我称之为 library (主要是 shared library,即动态链接库)的 ABI (application binary interface)。

2011-03-09 10:46:00 29355 63

原创 C++ 工程实践(3):采用有利于版本管理的代码格式

版本管理(version controlling)是每个程序员的基本技能,C++ 程序员也不例外。版本管理的基本功能之一是追踪代码变化,让你能清楚地知道代码是如何一步步变成现在的这个样子,以及每次 check-in 都具体改动了哪些内部。所谓“有利于版本管理”的代码格式,就是指在代码中合理使用换行符,对 diff 工具友好,让 diff 的结果清晰明了地表达代码的改动。

2011-03-05 15:16:00 15363 24

原创 为什么 muduo 的 shutdown() 没有直接关闭 TCP 连接?

今天收到一位网友来信:在 simple 中的 daytime 示例中,服务端主动关闭时调用的是如下函数序列,这不是只是关闭了连接上的写操作吗,怎么是关闭了整个连接?陈硕答复如下:Muduo TcpConnection 没有提供 close,而只提供 shutdown ,这么做是为了收发数据的完整性。

2011-02-25 21:30:00 12816 8

原创 Muduo 网络编程示例之四:Twisted Finger

Python Twisted 是一款非常好的网络库,它也采用 Reactor 作为网络编程的基本模型,所以从使用上与 muduo 颇有相似之处。(当然,muduo 没有 deferreds)Finger 是 twisted 文档的一个经典例子,本文展示如何用 muduo 来实现最简单的 finger 服务端。限于篇幅,只实现 finger01~07。代码位于 examples/twisted/finger 。

2011-02-23 21:34:00 7459 3

原创 C++ 工程实践(2):不要重载全局 ::operator new()

对于现实生活中的 C++ 项目,重载 ::operator new() 几乎没有用武之地,因为很难处理好与程序所用的 C++ library 的关系。如果确实需要,我们可以从 malloc 层面入手,彻底而全面地替换内存分配器。

2011-02-22 01:23:00 20235 28

原创 C++ 工程实践(1):慎用匿名 namespace

匿名 namespace (anonymous namespace 或称 unnamed namespace) 是 C++ 的一项非常有用的功能,其主要目的是让该 namespace 中的成员(变量或函数)具有独一无二的全局名称,避免名字碰撞 (name collisions)。一般在编写 .cpp 文件时,如果需要写一些小的 helper 函数,我们常常会放到匿名 namespace 里。muduo 0.1.7 中的 muduo/base/Date.cc 和 muduo/base/Thread.cc 等处

2011-02-15 22:56:00 36624 58

原创 C++ 多线程系统编程精要

这是一套紧凑的 PPT,基本上每一张幻灯片都可以单独写一篇博客,但是我没有那么多时间一一展开论述,只能把结论和主要论据列了出来。

2011-02-12 18:42:00 31923 29

原创 Muduo 网络编程示例之三:定时器

本文介绍在非阻塞网络编程中定时器的用法与注意事项。

2011-02-06 23:05:00 17163 21

原创 Muduo 网络编程示例之二:Boost.Asio 的聊天服务器

这是《Muduo 网络编程示例》系列的第二篇文章。 本文讲介绍一个与 Boost.Asio 的示例代码中的聊天服务器功能类似的网络服务程序,包括客户端与服务端的 muduo 实现。这个例子的主要目的是介绍如何处理分包,并初步涉及 Muduo 的多线程功能。

2011-02-04 08:58:00 22281 11

原创 Muduo 网络编程示例之一:五个简单 TCP 协议

这是《Muduo 网络编程示例》系列的第一篇文章。本文将介绍五个简单 TCP 网络服务协议的 muduo 实现,包括 echo (RFC 862)、discard (RFC 863)、chargen (RFC 864)、daytime (RFC 867)、time (RFC 868),以及 time 协议的客户端。以上五个协议使用不同的端口,可以放到同一个进程中实现,且不必使用多线程。

2011-02-02 12:59:00 20097 12

原创 Muduo 网络编程示例之零:前言

我将会写一系列文章,介绍用 muduo 网络库完成常见的 TCP 网络编程任务。这些例子都比较简单,逻辑不复杂,代码也很短,适合摘取关键部分放到博客上。其中一些有一定的代表性与针对性,比如“如何传输完整的文件”估计是网络编程的初学者经常遇到的问题。

2011-02-02 00:58:00 40087 34

原创 分布式系统的工程化开发方法

以下是我在珠三角技术沙龙 2010Q4 上的演讲投影片。

2010-10-19 00:54:00 62813 65

翻译 并发编程的 15 条建议(译)

内核专家 Bryan Cantrill 和 Jeff Bonwick 在 2008 年 9 月的《ACM Queue》上发表了《Real-world Concurrency》 一文,提出了 15 条并发编程的建议,这里简单摘录如下。 1. Know your cold paths from your hot paths. 弄清楚代码里的热门执行路径和冷门执行路径。 对冷门路径,用粗粒度的锁即可。对热门路径——也就是那些必须高度并发才能实现所期望的高吞吐量的代码,应该更加小心,加锁的策略必须简单明了且细粒

2010-09-29 23:56:00 34548 49

原创 击鼓传花:对比 muduo 与 libevent2 的事件处理效率

前面我们比较了 muduo 和 libevent2 的吞吐量,得到的结论是 muduo 比 libevent2 快 18%。有人会说,libevent2 并不是为高吞吐的应用场景而设计的,这样的比较不公平,胜之不武。为了公平起见,这回我们用 libevent2 自带的性能测试程序(击鼓传花)来对比 muduo 和 libevent2 在高并发情况下的 IO 事件处理效率。 结论:在 IO 事件处理效率方面,muduo 与 libevent2 总体比较接近,各擅胜场。在并发量特别大的情况下(大于 10k),m

2010-09-08 01:00:00 21039 18

原创 muduo 与 libevent2 吞吐量对比

libevent 是一款非常好用的 C 语言网络库,它也采用 Reactor 模型,正好可以与 muduo 做一对比。 本文用 ping pong 测试来对比 muduo 和 libevent2 的吞吐量,测试结果表明 muduo 吞吐量平均比 libevent2 高 18% 以上,个别情况达到 70%。

2010-09-05 18:43:00 34318 18

原创 muduo 与 boost asio 吞吐量对比

muduo 是一个基于 Reactor 模式的 C++ 网络库,我在编写它的时候并没有以高并发高吞吐为主要目标,但出乎我的意料,ping pong 测试表明,muduo 吞吐量比 boost.asio 高 15% 以上。

2010-09-04 16:24:00 45241 40

原创 发布一个基于 Reactor 模式的 C++ 网络库

Muduo 是我在业余时间编写的基于 Reactor 模式的 C++ 网络库,适用于 Linux 平台,支持多线程。本文主要介绍 muduo 网络库的使用。其设计与实现将有另文讲解。

2010-08-29 23:38:00 95191 76

原创 发布一个 Linux 下的 C++ 多线程库

发布一个我自己业余时间编写的 C++ 多线程库 for Linux,这个库只有不到 1000 行源代码,封装了 pthreads 的常用功能(互斥器、条件变量、线程),实现了简单的线程池,并仿照 java concurrent 包编写了 BlockingQueue 和 CountDownLatch。库里的每个 class 都提供了使用样例。 这个库的内容:1. 整数的原子操作, AtomicInt32 和 AtomicInt64;2. 线程 Thread 和线程池 ThreadPool;3. 互斥器与条

2010-08-21 23:41:00 39522 77

原创 《程序中的日期与时间》第一章 日期计算

本文详细说明了以 Julian Day Number 为基础的日期处理的算法,解释了每个公式的意义,并用 C++ 语言实现了一个 Date class。

2010-08-15 23:15:00 17848 20

原创 计算机图书赠送

  最近清理出一批暂时用不上的计算机技术图书,准备送给需要它们的人。这些书大多是我 3 年前从北京搬到上海的,有的是我来上海之后买的。这些书有的我看过,更多的从买来就没有翻开。 赠送对象 1. 与我见过面吃过饭的技术人士、同学、朋友,或者 2. 没有见过面,但对技术感兴趣的人士(为了证明这一点,请向我展示您的技术博客) 赠送办法 1. 每人限选 2 本,少选不限 :) 2. 选好书之

2010-05-08 23:14:00 18984 72

原创 发布一个 Sockets 编程的交互式试验工具

学习 Sockets 网络编程的时候往往要写很多小程序来熟悉 api,触发各种时序,观察系统的行为。 最近在编写自己的 C++ 网络库,需要考察许多场景下 Sockets 系统调用的返回值。于是我写了一个简单的命令行交互式工具,用来手动触发各种边界条件。这让我能方便地观察系统的行为。 编译方法: 先安装 libreadline-dev $ sudo apt-get install libr

2010-04-17 22:20:00 7389 2

原创 整合 Google 开源 C++ 代码

  Google 开源了很多优秀的 C++ 程序库,本文介绍如何将其中几个整合到一起。 本文涉及的 Google 库有: gflags - 命令行参数解析。可以完全用命令行来配置应用程序,省去配置文件。 gtest - C++ 单元测试框架 gmock - C++ 单元测试中用到的 mock glog - 日志库 protobuf - 高效的网络协议格式

2010-04-17 21:37:00 36358 28

原创 对 C++ 历史的个人观点

先把 PPT 放出来,文章以后有空再写吧。

2010-04-06 20:33:00 20282 77

原创 学之者生,用之者死——ACE历史与简评

学之者生,用之者死——ACE历史与简评陈硕 (giantchen_AT_gmail)Blog.csdn.net/Solstice2010 March 10ACE 是现代面向对象网络编程的鼻祖,确立了许多重要模式,如 Reactor、Acceptor 等,重要到我们甚至觉得网络编程就应该是那样的。但为什么 ACE 叫好不叫座?大名鼎鼎却使用者寥寥?本文谈谈我的个人观点。ACE 是

2010-03-10 11:06:00 77497 205

原创 《多线程服务器的适用场合》例释与答疑

陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 March 3 - rev 01 《多线程服务器的适用场合》(以下简称《适用场合》)一文在博客登出之后,有热心读者提出质疑,我自己也觉得原文没有把道理说通说透,这篇文章试图用一些实例来解答读者的疑问。我本来打算修改原文,但是考虑到已经读过的读者不一定会注意到文章的变动,干脆另写一

2010-03-03 19:02:00 17235 23

原创 多线程服务器的适用场合

陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 Feb 28这篇文章原本是前一篇博客《多线程服务器的常用编程模型》(以下简称《常用模型》)计划中的一节,今天终于写完了。“服务器开发”包罗万象,本文所指的“服务器开发”的含义请见《常用模型》一文,一句话形容是:跑在多核机器上的 Linux 用户态的没有用户界面的长期运行的网络应用

2010-02-28 21:27:00 30886 48

原创 Linux 新增系统调用的启示

最近在研究 Linux 内核的时间子系统,为下一篇长文《服务器程序中的日期与时间》做准备,无意中注意到了 Linux 新增的几个系统调用的对编写服务器代码的影响,先大致记录在这里。这篇博客也可算作前一篇《多线程服务器的常用编程模型》的一个注脚。 1. 服务器程序的风格可能在变 新的创建文件描述符的 syscall 一般都支持额外的 flags 参数,可以直接指定 O_NONBLOCK 和 FD

2010-02-26 02:32:00 16233 11

原创 多线程服务器的常用编程模型

 多线程服务器的常用编程模型 陈硕 (giantchen_AT_gmail)Blog.csdn.net/Solstice2009 Feb 12 建议阅读本文 PDF 版下载: http://files.cppblog.com/Solstice/multithreaded_server.pdf 本文主要讲我个人在多线程开发方面的一些粗浅经验。总结了一两种常

2010-02-12 17:07:00 90610 31

原创 当析构函数遇到多线程──C++ 中线程安全的对象回调

 当析构函数遇到多线程── C++ 中线程安全的对象回调 陈硕 (giantchen_AT_gmail)Blog.csdn.net/Solstice请尽量阅读本文 PDF 版:http://www.cppblog.com/Files/Solstice/dtor_meets_mt.pdf 豆丁亦可,内容略微滞后: http://www.docin.com/p-42460300

2010-01-22 22:15:00 50106 59

当析构函数遇到多线程── C++ 中线程安全的对象回调 PDF

编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有的互斥器来保护。如何保证即将析构对象 x 的时候,不会有另一个线程正在调用 x 的成员函数?或者说,如何保证在执行 x 的成员函数期间,对象 x 不会在另一个线程被析构?如何避免这种竞态条件是 C++ 多线程编程面临的基本问题,可以借助 boost 的 shared_ptr 和 weak_ptr 完美解决。这也是实现线程安全的 Observer 模式的必备技术。 本文源自陈硕在 2009 年 12 月上海 C++ 技术大会的一场演讲《当析构函数遇到多线程》,内容略有增删。原始 PPT 可从 http://download.csdn.net/source/1982430 下载。 本文读者应具有 C++ 多线程编程经验,熟悉互斥器、竞态条件等概念,了解智能指针,知道 Observer 设计模式。

2010-01-23

当析构函数遇到多线程── C++ 中线程安全的对象回调

编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有的互斥器来保护。如何保证即将析构对象 x 的时候,不会有另一个线程正在调用 x 的成员函数?或者说,如何保证在执行 x 的成员函数期间,对象 x 不会在另一个线程被析构?如何避免这种竞态条件是 C++ 多线程编程面临的基本问题,可以借助 boost 的 shared_ptr 和 weak_ptr 完美解决。这也是实现线程安全的 Observer 模式的必备技术。 本文源自我在 2009 年 12 月上海 C++ 技术大会的一场演讲《当析构函数遇到多线程》,内容略有增删。原始 PPT 可从 http://download.csdn.net/source/1982430 下载。 本文读者应具有 C++ 多线程编程经验,熟悉互斥器、竞态条件等概念,了解智能指针,知道 Observer 设计模式。

2010-01-22

《当析构函数遇到多线程》PPT

这是陈硕在 2009 年上海 C++ 技术大会演讲《当析构函数遇到多线程》的 PPT 投影片,可自由用于个人学习,其他使用需得到作者许可。 简介:编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有的互斥器来保护。如何保证即将析构对象 x 的时候,不会有另一个线程正在调用 x 的成员函数?或者说,如何保证在执行 x 的成员函数期间,对象 x 不会在另一个线程被析构?如何避免这种 race condition 是 C++ 多线程编程面临的基本问题,可以借助 tr1 中的 shared_ptr 和 weak_ptr 完美解决。这也是实现线程安全的 Observer 模式的必备技术。

2010-01-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除