请选择 进入手机版 | 继续访问电脑版

C++编程

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: ID紫麒麟

紫麒麟笔记_1杂乱

[复制链接]

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2016-3-31 14:41:19 | 显示全部楼层
#include_next 这个东东是个啥?

哈哈,蒙了吧,这个东西不是VC里面的东西,是GNU扩展的一个玩意儿,当你在代码中看到这个东西的时候,我想问你,你是不是在搞移植的东西啊。
#include_next和#include指令一样,也是包含一个头文件,它们的不同地方是包含的路径不一样。
#include_next的意思就是“包含指定的这个文件所在的路径的后面路径的那个文件”,不区分<>和""

昨天听说一个消息windows跟Ubuntu似乎有点儿新消息,听说在win10下面可以直接运行Ubuntu的程序,不是虚拟机类的。不晓得他们能折腾出个啥东西呢。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2016-4-6 09:31:55 | 显示全部楼层
本帖最后由 ID紫麒麟 于 2016-4-6 12:59 编辑

记得以前似乎想明白的一个东西,现在再看觉得有点儿头晕。。。。
http://www.cnblogs.com/crazyapple/archive/2013/04/04/2999433.html
另外这个博客似乎有不少有意思的算法的东西。


轻松一下
http://www.bilibili.com/video/av1092221/

回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2016-4-14 10:55:56 | 显示全部楼层
本帖最后由 ID紫麒麟 于 2016-4-14 17:21 编辑

int *p = new int;
*p = 9;        
delete p;        
std::cout << *p << std::endl;

出现的现象可能会五花八门,崩溃,随机数,甚至对什么数据造成伤害

还有一个东西比较有意思,就是写出一个不能被继承的C++的类。这个可以自行百度,比较有意思,看看的话对于理解继承有好处。虽然C++11已经有final这个关键字了,但是看看也挺好的一个小知识点。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2016-4-14 17:28:21 | 显示全部楼层
再写一个吧
在一个数组中有101个int值,有50个int值出现了2次,问那个单独的数字是什么?


答案是将数组中所有的数字异或一下就行了。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2016-4-15 10:10:18 | 显示全部楼层
本帖最后由 ID紫麒麟 于 2016-4-15 10:13 编辑

今天有点儿懒,随便搞一个东西吧,网上找的一个文章,另外这个文章里面的一些链接已经不对应了,可以自行百度对应的名字去找相应的链接。

内容目录:
1、C++各大有名库的介绍——C++标准库
2、C++各大有名库的介绍——准标准库Boost
3、C++各大有名库的介绍——GUI
4、C++各大有名库的介绍——网络通信
5、C++各大有名库的介绍——XML
6、C++各大有名库的介绍——科学计算
7、C++各大有名库的介绍——游戏开发
8、C++各大有名库的介绍——线程
9、C++各大有名库的介绍——序列化
10、C++各大有名库的介绍——字符串
11、C++各大有名库的介绍——综合
12、C++各大有名库的介绍——其他库


在 C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重 量级的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者水平,其中很多并不了解。所以文中所提的一些库都是比 较著名的大型库。


1、C++各大有名库的介绍——C++标准库
标准库中提供了C++程序的基本设施。虽然C++标准库随着C++标准折腾了许多年,直到标准的出台才正式定型,但是在标准库的实现上却很令人欣慰得看到多种实现,并且已被实践证明为有工业级别强度的佳作。
1.1、Dinkumware C++ Library

参考站点:http://www.dinkumware.com/

P.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr. Dobb's程序设计杰出奖的获得者。其编写的库长期被Microsoft采用,并且最近Borland也取得了其OEM的license,在其 C/C++的产品中采用Dinkumware的库。

1.2、RogueWave Standard C++ Library

参考站点:http://www.roguewave.com/

这个库在Borland C++ Builder的早期版本中曾经被采用,后来被其他的库给替换了。笔者不推荐使用。

1.3、SGI STL

参考站点:http://www.roguewave.com/

SGI公司的C++标准模版库。

1.4、STLport

参考站点:http://www.stlport.org/

SGI STL库的跨平台可移植版本。



2、C++各大有名库的介绍——准标准库Boost
Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。
Boost中比较有名气的有这么几个库:

2.1 Regex  正则表达式库

2.2 Spirit   LL parser framework,用C++代码直接表达EBNF

2.3 Graph  图组件和算法

2.4 Lambda  在调用的地方定义短小匿名的函数对象,很实用的functional功能

2.5 concept check   检查泛型编程中的concept

2.6 Mpl   用模板实现的元编程框架

2.7 Thread   可移植的C++多线程库

2.8 Python   把C++类和函数映射到Python之中

2.9 Pool    内存池管理

2.10 smart_ptr   5个智能指针,学习智能指针必读,一份不错的参考是来自CUJ的文章:

Smart Pointers in Boost,哦,这篇文章可以查到,CUJ是提供在线浏览的。中文版见笔者在《Dr.Dobb's Journal软件研发杂志》第7辑上的译文。

  Boost总体来说是实用价值很高,质量很高的库。并且由于其对跨平台的强调,对标准C++的强调,是编写平台无关,现代C++的开发者必备的 工具。但是Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。并且很多Boost中的库功能堪称对语言功能的扩展,其构造用尽精巧的手 法,不要贸然的花费时间研读。Boost另外一面,比如Graph这样的库则是具有工业强度,结构良好,非常值得研读的精品代码,并且也可以放心的在产品 代码中多多利用。

参考站点:http://www.boost.org


3、C++各大有名库的介绍——GUI
在众多C++的库中,GUI部分的库算是比较繁荣,也比较引人注目的。在实际开发中,GUI库的选择也是非常重要的一件事情,下面我们综述一下可选择的GUI库,各自的特点以及相关工具的支持。
3.1、MFC

  大名鼎鼎的微软基础类库(Microsoft Foundation Class)。大凡学过VC++的人都应该知道这个库。虽然从技术角度讲,MFC是不大漂亮的,但是它构建于Windows API 之上,能够使程序员的工作更容易,编程效率高,减少了大量在建立 Windows 程序时必须编写的代码,同时它还提供了所有一般 C++ 编程的优点,例如继承和封装。MFC 编写的程序在各个版本的Windows操作系统上是可移植的,例如,在Windows 3.1下编写的代码可以很容易地移植到 Windows NT 或 Windows 95 上。但是在最近发展以及官方支持上日渐势微。

3.2、QT

参考网站:http://www.trolltech.com

  Qt是Trolltech公司的一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功 能。Qt是完全面向对象的很容易扩展,并且允许真正地组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序 的基础。Qt也是流行的Linux桌面环境KDE 的基础,同时它还支持Windows、Macintosh、Unix/X11等多种平台。[wangxinus注T目前已经是Nokia旗下的产品,原项目主页已经失效,目前为http://qt.nokia.com.2009年初发布的Qt4.5版本开始使用LGPL协议,诺基亚希望以此来吸引更多的开发人员使用Qt库]

3.3、WxWindows

参考网站:http://www.wxwindows.org

  跨平台的GUI库。因为其类层次极像MFC,所以有文章介绍从MFC到WxWindows的代码移植以实现跨平台的功能。通过多年的开发也是一个日趋完善的GUI库,支持同样不弱于前面两个库。并且是完全开放源代码的。新近的C++ Builder X的GUI设计器就是基于这个库的。[wangxinus注:迫于微软的施压,已经由WxWindows更名为wxWidgets]

3.4、Fox

参考网站:http://www.fox-toolkit.org/

  开放源代码的GUI库。作者从自己亲身的开发经验中得出了一个理想的GUI库应该是什么样子的感受出发,从而开始了对这个库的开发。有兴趣的可以尝试一下。

3.5、WTL

  基于ATL的一个库。因为使用了大量ATL的轻量级手法,模板等技术,在代码尺寸,以及速度优化方面做得非常到位。主要面向的使用群体是开发COM轻量级供网络下载的可视化控件的开发者。

3.6、GTK

参考网站:http://gtkmm.sourceforge.net/

  GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnome这样的杀手应用。而Qt就是这个库的C++封装版本。[wangxinus注:“Qt 就是这个库的C++封装版本”是错误的。Qt早于GTK,最初Qt由于协议的原因引起社区的不满,另外开发了一个基于C语言的GTK库,后面的扩展版本为 GTK+。GTK+的Gnome和Qt的KDE是目前linux桌面的两大阵营,曾有水火不容之势。目前双方都以及开源社区的精神,已经和解。]


4、C++各大有名库的介绍——网络通信
4.1、ACE

参考网站:http://www.cs.wustl.edu/~schmidt/ACE.html

  C++库的代表,超重量级的网络通信开发框架。ACE自适配通信环境(Adaptive Communication Environment)是可以自由使用、开放源代码的面向对象框架,在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++ 包装外观(Wrapper Facade)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。

4.2、StreamModule

参考网站:http://www.omnifarious.org/StrMod

  设计用于简化编写分布式程序的库。尝试着使得编写处理异步行为的程序更容易,而不是用同步的外壳包起异步的本质。

4.3、SimpleSocket

参考网站:http://home.hetnet.nl/~lcbokkers/simsock.htm

  这个类库让编写基于socket的客户/服务器程序更加容易。

4.4、A Stream Socket API for C++

参考网站:http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html

  又一个对Socket的封装库。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2016-4-15 10:10:46 | 显示全部楼层


5、C++各大有名库的介绍——XML
5.1、Xerces

参考网站:http://xml.apache.org/xerces-c/

  Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证,以及SAX和DOM API。XML验证在文档类型定义(Document Type Definition,DTD)方面有很好的支持,并且在2001年12月增加了支持W3C XMLSchema 的基本完整的开放标准。

5.2、XMLBooster

参考网站:http://www.xmlbooster.com/

  这个库通过产生特制的parser的办法极大的提高了XML解析的速度,并且能够产生相应的GUI程序来修改这个parser。在DOM和SAX两大主流XML解析办法之外提供了另外一个可行的解决方案。

5.3、Pull Parser

参考网站:http://www.extreme.indiana.edu/xgws/xsoap/xpp

  这个库采用pull方法的parser。在每个SAX的parser底层都有一个pull的parser,这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得尝试。

5.4、Xalan

参考网站:http://xml.apache.org/xalan-c/

  Xalan是一个用于把XML文档转换为HTML,纯文本或者其他XML类型文档的XSLT处理器。

5.5、CMarkup

参考网站:http://www.firstobject.com/xml.htm

  这是一种使用EDOM的XML解析器。在很多思路上面非常灵活实用。值得大家在DOM和SAX之外寻求一点灵感。

5.6、libxml++

http://libxmlplusplus.sourceforge.net/

  libxml++是对著名的libxml XML解析器的C++封装版本。

5.7. TinyXML [wangxinus注:一个非常小巧的XML解析库,基于DOM的。]


6、C++各大有名库的介绍——科学计算
6.1、Blitz++

参考网站:http://www.oonumerics.org/blitz

  Blitz++ 是一个高效率的数值计算函数库,它的设计目的是希望建立一套既具像C++ 一样方便,同时又比Fortran速度更快的数值计算环境。通常,用C++所写出的数值程序,比 Fortran慢20%左右,因此Blitz++正是要改掉这个缺点。方法是利用C++的template技术,程序执行甚至可以比Fortran更快。

  Blitz++目前仍在发展中,对于常见的SVD,FFTs,QMRES等常见的线性代数方法并不提供,不过使用者可以很容易地利用Blitz++所提供的函数来构建。

6.2、POOMA

参考网站:http://www.codesourcery.com/pooma/pooma

  POOMA是一个免费的高性能的C++库,用于处理并行式科学计算。POOMA的面向对象设计方便了快速的程序开发,对并行机器进行了优化以达到最高的效率,方便在工业和研究环境中使用。

6.3、MTL

参考网站:http://www.osl.iu.edu/research/mtl

  Matrix Template Library(MTL)是一个高性能的泛型组件库,提供了各种格式矩阵的大量线性代数方面的功能。在某些应用使用高性能编译器的情况下,比如Intel的编译器,从产生的汇编代码可以看出其与手写几乎没有两样的效能。

6.4、CGAL

参考网站:www.cgal.org

  Computational Geometry Algorithms Library的目的是把在计算几何方面的大部分重要的解决方案和方法以C++库的形式提供给工业和学术界的用户。


7、C++各大有名库的介绍——游戏开发
7.1、Audio/Video 3D C++ Programming Library

参考网站:http://www.galacticasoftware.com/products/av/

  AV3D是一个跨平台,高性能的C++库。主要的特性是提供3D图形,声效支持(SB,以及S3M),控制接口(键盘,鼠标和遥感),XMS。

7.2、KlayGE

参考网站:http://home.g365.net/enginedev/

  国内游戏开发高手自己用C++开发的游戏引擎。KlayGE是一个开放源代码、跨平台的游戏引擎,并使用Python作脚本语言。KlayGE在LGPL协议下发行。感谢龚敏敏先生为中国游戏开发事业所做出的贡献。

[wangxinus注:这个库国人了解很少,百度百科的KlayGE词条还是本人创建的。一个人开发一个游戏引擎库,是在让笔者汗颜,对作者表示钦佩!]

7.3、OGRE

参考网站:http://www.ogre3d.org

  OGRE(面向对象的图形渲染引擎)是用C++开发的,使用灵活的面向对象3D引擎。它的目的是让开发者能更方便和直接地开发基于3D硬件设备 的应用程序或游戏。引擎中的类库对更底层的系统库(如:Direct3D和OpenGL)的全部使用细节进行了抽象,并提供了基于现实世界对象的接口和其 它类。


8、C++各大有名库的介绍——线程
8.1、C++ Threads

参考网站:http://threads.sourceforge.net/

  这个库的目标是给程序员提供易于使用的类,这些类被继承以提供在Linux环境中很难看到的大量的线程方面的功能。

8.2、ZThreads

参考网站:http://zthread.sourceforge.net/

  一个先进的面向对象,跨平台的C++线程和同步库。


9、C++各大有名库的介绍——序列化
9.1、s11n

参考网站:http://s11n.net/

  一个基于STL的C++库,用于序列化POD,STL容器以及用户定义的类型。

9.2、Simple XML Persistence Library

参考网站:http://sxp.sourceforge.net/

  这是一个把对象序列化为XML的轻量级的C++库。


10、C++各大有名库的介绍——字符串
10.1、C++ Str Library

参考网站:http://www.utilitycode.com/str/

  操作字符串和字符的库,支持Windows和支持gcc的多种平台。提供高度优化的代码,并且支持多线程环境和Unicode,同时还有正则表达式的支持。

10.2、Common Text Transformation Library

参考网站:http://cttl.sourceforge.net/

  这是一个解析和修改STL字符串的库。CTTL substring类可以用来比较,插入,替换以及用EBNF的语法进行解析。

10.3、GRETA

参考网站:http://research.microsoft.com/projects/greta/

  这是由微软研究院的研究人员开发的处理正则表达式的库。在小型匹配的情况下有非常优秀的表现。


11、C++各大有名库的介绍——综合
11.1、P::Classes

参考网站:http://pclasses.com/

  一个高度可移植的C++应用程序框架。当前关注类型和线程安全的signal/slot机制,i/o系统包括基于插件的网络协议透明的i/o架构,基于插件的应用程序消息日志框架,访问sql数据库的类等等。

11.2、ACDK - Artefaktur Component Development Kit

参考网站:http://acdk.sourceforge.net/

  这是一个平台无关的C++组件框架,类似于Java或者.NET中的框架(反射机制,线程,Unicode,废料收集,I/O,网络,实用工具,XML,等等),以及对Java, Perl, Python, TCL, Lisp, COM 和 CORBA的集成。

11.3、dlib C++ library

参考网站:http://www.cis.ohio-state.edu/~kingd/dlib/

  各种各样的类的一个综合。大整数,Socket,线程,GUI,容器类,以及浏览目录的API等等。

11.4、Chilkat C++ Libraries

参考网站:http://www.chilkatsoft.com/cpp_libraries.asp

  这是提供zip,e-mail,编码,S/MIME,XML等方面的库。

11.5、C++ Portable Types Library (PTypes)

参考网站:http://www.melikyan.com/ptypes/

  这是STL的比较简单的替代品,以及可移植的多线程和网络库。

11.6、LFC

参考网站:http://lfc.sourceforge.net/

  哦,这又是一个尝试提供一切的C++库


12、C++各大有名库的介绍——其他库
12.1、Loki

参考网站:http://www.moderncppdesign.com/

  哦,你可能抱怨我早该和Boost一起介绍它,一个实验性质的库。作者在loki中把C++模板的功能发挥到了极致。并且尝试把类似设计模式这样思想层面的东西通过库来提供。同时还提供了智能指针这样比较实用的功能。

12.2、ATL

  ATL(Active Template Library)是一组小巧、高效、灵活的类,这些类为创建可互操作的COM组件提供了基本的设施。

12.3、FC++: The Functional C++ Library

  这个库提供了一些函数式语言中才有的要素。属于用库来扩充语言的一个代表作。如果想要在OOP之外寻找另一分的乐趣,可以去看看函数式程序设计的世界。大师Peter Norvig在 “Teach Yourself Programming in Ten Years”一文中就将函数式语言列为至少应当学习的6类编程语言之一。

12.4、FACT!

参考网站:http://www.kfa-juelich.de/zam/FACT/start/index.html

  另外一个实现函数式语言特性的库

12.5、Crypto++

  提供处理密码,消息验证,单向hash,公匙加密系统等功能的免费库。

  还有很多非常激动人心或者是极其实用的C++库,限于我们的水平以及文章的篇幅不能包括进来。在对于这些已经包含近来的库的介绍中,由于并不是每一个我们都使用过,所以难免有偏颇之处,请读者见谅
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2016-4-15 11:23:01 | 显示全部楼层

另外还有一篇总结挺不错的
http://www.open-open.com/lib/view/open1436002695888.html
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2016-4-15 15:15:28 | 显示全部楼层
见到一个比较好的文章,叫《我是一个线程》

 我是一个线程,我一出生就被编了个号: 0x3704,然后被领到一个昏暗的屋子里, 这里我发现了很多和我一模一样的同伴。
  我身边的同伴0x6900待的时间比较长, 他带着沧桑的口气对我说:
  “我们线程的宿命就是处理包裹。把包裹处理完以后还得马上回到这里,否则可能永远回不来了。”
  我一脸懵懂,包裹,什么包裹?
  “不要着急,马上你就会明白了, 我们这里是不养闲人的。”
  果然,没多久,屋子的门开了, 一个面貌凶恶的家伙吼道:
  “0x3704 ,出来!”
  我一出来就被塞了一个沉甸甸的包裹,上面还有附带着一个写满了操作步骤的纸。
  “快去,把这个包裹处理了。”
  “去哪儿处理?”
  “跟着指示走, 先到就绪车间”
  果然,地上有指示箭头,跟着它来到了一间明亮的大屋子,这里已经有不少线程了, 大家都很紧张,好像时刻准备着往前冲。
  我刚一进来,就听见广播说:“0x3704,进入车间”
  我赶紧往前走, 身后很多人议论说:
  ”他太幸运了, 刚进入就绪状态就能运行”
  “是不是有关系?”
  “不是,你看人家的优先级多高啊, 唉~”
  前边就是车间, 这里简直是太美了, 怪不得老线程总是唠叨着说:要是能一直待在这里就好了。
  这里空间大,视野好,空气清新,鸟语花香,还有很多从来没见过的人,像服务员一样等着为我服务。
  他们也都有编号, 更重要的是每个人还有个标签,上面写着:硬盘,数据库,内存,网卡...
  我现在理解不了,看看操作步骤吧:
第一步:从包裹中取出参数
  打开包裹, 里边有个HttpRequest对象,可以取到userName, password两个参数。
  第二步:执行登录操作
  奥,原来是有人要登录啊,我把userName/password 交给数据库服务员,他拿着数据, 慢腾腾的走了。
  他怎么这么慢?不过我是不是正好可以在车间里多待一会儿? 反正也没法执行第三步。
  就在这时,车间里的广播响了: 
  “0x3704,我是CPU,记住你正在执行的步骤,马上带包裹离开”
  我慢腾腾的开始收拾。。。
  “快点, 别的线程马上就要进来了”
  离开这个车间, 又来到一个大屋子,这里很多线程慢腾腾的在喝茶,打牌。
  “哥们,你们没事干了?”
  “你新来的吧,你不知道我在等数据库服务员给我数据啊,据说他们比我们慢好几十万倍, 在这里好好歇吧”
  “啊? 这么慢? 我这里有人在登录系统, 能等这么长时间吗”
  “放心,你没听说过人间一天,CPU一年吗, 我们这里是用纳秒,毫秒计时的,人间等待一秒,相当于我们好几天呢,来的及”
  干脆睡一会吧 , 不知道过了多久 ,大喇叭又开始广播了:
  “0x3704, 你的数据来了,快去执行”
  我转身就往CPU车间跑,发现这里的们只出不进!
  后面传来阵阵哄笑声:
  “果然是新人,不知道还得去就绪车间等”
  于是赶紧到就绪车间,这次没有那么好运了,等了好久才被再次叫进CPU车间。
  在等待的时候, 我听见有人小声议论:
  “听说了吗,最近有个线程被kill掉了”
  “为啥啊?”
  “这家伙赖在CPU车间不走,把CPU利用率一直搞成100%,后来就被kill掉了”
  “Kill掉以后弄哪儿去了”
  “可能被垃圾回收了吧”
  我心里打了个寒噤 , 赶紧接着处理,收下的动作块多了,第二步登录成功了。
  第三步:构建登录成功后的主页
  这一步有点费时间, 因为有很多HTML需要处理, 不知道代码谁写的,处理起来很烦人。
  我正在紧张的制作HTM呢, CPU有开始叫了:
  “0x3704,我是CPU,记住你正在执行的步骤,马上带包裹离开”
  “为啥啊”
  “每个线程只能在CPU上运行一段时间,到了时间就得让别人用了,你去就绪车间待着, 等着叫你吧”
  就这样, 我一直在“就绪-运行”这两个状态,不知道轮转了多少次,终于安装步骤清单把工作做完了。
  最后顺利的把包含HTML的包裹发了回去。
  至于登录以后干什么事儿 ,我就不管了。
  马上就要回到我那昏暗的房间了,真有点舍不得这里。
  不过相对于有些线程, 我还是幸运的, 他们运行完以后就彻底的销毁了,而我还活着!
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2016-4-15 15:16:03 | 显示全部楼层
回到了小黑屋, 老线程0x6900问:
  “怎么样?第一天有什么感觉?”
  “我们的世界规则很复杂,首先你不知道什么时候会被挑中执行;第二,在执行的过程中随时可能被打断,让出CPU车间;第三,一旦出现硬盘,数据库这样耗时的操作也得让出CPU,去等待;第四,就是数据来了,你也不一定马上执行,还得等着CPU挑选”
  “小伙子理解的不错啊”
  “我不明白为什么很多线程都执行完就死了, 为什么咱们还活着?”
  “你还不知道,长生不老是我们的特权,我们这里有个正式的名称,叫做线程池!”
  平淡的日子就这么一天天过去,作为一个线程,我每天的生活都是取包裹,处理包裹,然后回到我们昏暗的家:线程池。
  有一天我回来的时候,听到有个兄弟说,今天要好好休息下,明天就是最疯狂的一天。
  我看了一眼日历,明天是 11月11号。
  果然,零点刚过,不知道那些人类怎么了,疯狂的投递包裹,为了应付蜂拥而至的海量包裹,线程池里没有一个人能闲下来,全部出去处理包裹,CPU车间利用率超高,硬盘在嗡嗡转,网卡疯狂的闪,即便如此,还是处理不完,堆积如山。
  我们也没有办法,实在是太多太多了,这些包裹中大部分都是浏览页面,下订单,买,买,买。
  不知道过了多久,包裹山终于慢慢的消失了。
  终于能够喘口气, 我想我永远都不会忘记这一天。
  通过这个事件,我明白了我所处的世界:这是一个电子商务的网站!
  我每天的工作就是处理用户的登录,浏览, 购物车,下单,付款。
  我问线程池的元老0x6900:“我们要工作到什么时候?”
  “要一直等到系统重启的那一刻”,0x6900说。
  “那你经历过系统重启吗?”
  “怎么可能?系统重启就是我们的死亡时刻, 也就是世界末日,一旦重启,整个线程池全部销毁,时间和空间全部消失,一切从头再来”
  “那什么时候会重启?”
  “这就不好说了,好好享受眼前的生活吧.....”
  其实生活丰富多彩,我最喜欢的包裹是上传图片,由于网络慢,所以能在就绪车间,CPU车间待很长很长时间,可以认识很多好玩的线程。
  比如说上次认识了memecached线程,他给我说通过他缓存了很多的用户数据, 还是分布式的! 很多机器上都有!
  我说怪不得后来的登录操作快了那么多, 原来是不再从数据库取数据了你那里就有啊,哎,对了,你是分布式的,你去过别的机器没有?
  他说怎么可能,我每次也只能通过网络往那个机器发送一个GET, PUT命令才存取数据而已,别的一概不知。
  再比如说上次在等待的时候遇到了数据库连接的线程,我才知道它他那里也是一个连接池,和我们线程池几乎一模一样。
  他说有些包裹太变态了,竟然查看一年的订单数据,简直把我累死了。
  我说拉倒吧你,你那是纯数据,你把数据传给我以后,我还得组装成HTML,工作量不知道比你大多少倍。
  他说一定你要和memecached搞好关系,直接从他那儿拿数据,尽量少直接调用数据库,我们JDBC connection也能活的轻松点。
  我说好啊好啊,关键是你得提前把数据搞到缓存啊,要不然我先问一遍缓存,没有数据,我这不还得找你吗?
  生活就是这样,如果你自己不找点乐子,还有什么意思?
  有一天我遇到一个可怕的事情, 差一点死在外边,回不了线程池了......
  其实这次遇险我应该能够预想到才对, 太大意了。
  前几天我处理过一些从http发来的存款和取款的包裹,老线程0x6900特意嘱咐我:
  “处理这些包裹的时候要特别小心,你得一定要先获得一把锁,在对账户存款或者取款的时候一定要把账户给锁住,要不然别的线程就会在你等待的时候趁虚而入,搞破坏,我年轻那会儿很毛糙,就捅了篓子”
  为了“恐吓”我,好心的0x6900还给了我两个表格:
  1、没有加锁的情况
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2016-4-15 15:16:38 | 显示全部楼层
1、没有加锁的情况

  2、加锁的情况

  我看的胆颤心惊, 原来不加锁会带来这么严重的事故。
  从此以后看到存款,取款的包裹就倍加小心,还好,没有出过事故。
  今天我收到的一个包裹是转账,从某著名演员的账号给某著名导演赚钱,具体是谁我就不透漏了,数额可真是不小。
  我按照老线程的吩咐,肯定要加锁啊,先对著名演员账号加锁,在对著名导演账号加锁。
  可我万万没想到的是,还有一个线程,对,就是0x7954,竟然同时在从这个导演到往这个演员转账。
  于是乎,就出现了这么个情况:

  刚开始我还不知道什么情况,一直坐在等待车间傻等,可是等的时间太长了,长达几十秒!我可从来没有经历过这样的事件。
  这时候我就看到了线程0x7954,他悠闲的坐在那里喝咖啡,我和他聊了起来:
  “哥们,我看你已经喝了8杯咖啡了,怎么还不去干活?”
  “你不喝了9杯茶了吗?” 0x7954 回敬到。
  “我在等一个锁, 不知道哪个孙子一直不释放”
  “我也在等锁啊,我要是知道哪个孙子不释放锁我非揍死他不可 ” 0x7954 毫不示弱。
  我偷偷的看了一眼,这家伙怀里不就抱着我正在等的某导演的锁嘛?
  很明显,0x7954也发现了我正抱着他正在等待的锁。
  很快我们两个就吵了起来,互不相让:
  “把你的锁先给我,让我先做完”
  “不行,从来都是做完工作才释放锁,现在绝对不能给你”
  从争吵到打起来,就那么几秒钟的事儿。
  更重要的是,我们俩不仅仅持有这个著名导演和演员的锁,还有很多其他的锁,导致等待的线程越来越多,围观的人们把屋子都挤满了。
  最后事情真的闹大了,我从来没见过的终极大Boss“操作系统”也来了。
  大Boss毕竟是见多识广,他看了一眼,哼了一声,很不屑的说:
  “又出现死锁了”
  “你们俩要Kill掉一个, 来吧,过来抽签”
  这一下子把我给吓尿了,这么严重啊!
  我战战兢兢的抽了签,打开一看,是个"活"字。
  唉,小命终于保住了。
  可怜的0x7954被迫交出了所有的资源以后,很不幸的被kill掉,消失了。
  我拿到了导演的锁,可以开始干活了。
  大Boss操作系统如一阵风似的消失了,身后只传来他的声音:
  “记住, 我们这里导演>演员,无论认识情况都要先获得导演的锁”
  由于不仅仅是只有导演和演员,还有很多其他人,Boss留下了一个表格,里边是个算法,用来计算资源的大小,计算出来以后,永远按照从大到小的方式来获得锁:


  我回到线程池,大家都知道了我的历险,围着我问个不停。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|C++编程  

GMT+8, 2019-12-10 06:11 , Processed in 0.125000 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表