自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

amoscykl的博客

凡有成者,必务于实。凡有所学,皆成性格。

  • 博客(21)
  • 收藏
  • 关注

原创 递归——线性递归与二分递归

递归线性递归例子1:数组求和int sum( int A[], int n) { //数组求和算法:线性递归版 if ( 1 > n ) //平凡情况,递归基 return 0; //直接计算 else //一般情况 return sum(A, n-1) + A[n - 1]; //递归:前n-1项之和,再累计第n-1项}每一递归实例对自身的调用至多一次。于是,每...

2018-06-29 23:35:57 4769 1

原创 muduo C++ 网络库——线程同步精要(2):条件变量

条件变量条件变量的详细介绍在之前的一篇博文中:Linux线程同步——条件变量互斥器是加锁原语,用来排他性地访问共享数据,使用mutex时,我们希望立即拿到锁,然后尽快访问数据,用完之后尽快解锁,这样才能不影响并发性和性能。先介绍moduo中condition的封装:[cpp] view plain copyclass Condition : boost::noncopyable  {      p...

2018-06-20 18:35:14 350

原创 muduo C++ 网络库——线程同步精要(1):互斥锁

互斥器:使用得最多的同步原语互斥锁的详细介绍在这一篇博文中:互斥锁 概念补充:RAII——资源的有效期与持有资源的对象的生命期严格绑定,即由对象的构造函数完成资源的分配(获取),同时由析构函数完成资源的释放。只要对象能正确地析构,就不会出现资源泄漏问题。 互斥器保护了临界区,任何一个时刻最多只能有一个线程在此mutex划出的临界区内活动。单独使用mutex时,主要为了保护共享数据。原则:-用RA...

2018-06-20 18:32:14 752

原创 muduo C++ 网络库——线程同步精要

并发编程有两种基本模型:message passing 消息传递 和 shared memory 内存共享运行在多台机器上的多个进程的并行编程只有一种实用模型: message passing 线程同步的四项原则:按重要性排列1.首要原则是最低限度地共享对象,减少需要同步的场合。一个对象能不暴露给别的进程就不要暴露。2.其次是使用高级的并发编程构件,如TaskQueue,Producer-Cons...

2018-06-20 18:25:14 720

原创 muduo C++ 网络库——封装MutexLock、MutexLockGuard、Condition

MutexLock,MutexLockGuard,Condition这几个class都不允许拷贝构造和赋值。class MutexLock : boost::noncopyable{ public: MutexLock() : holder_(0) { pthread_mutex_init(&mutex_,NULL); } ~MutexLock(...

2018-06-20 18:17:35 778

原创 条件变量之虚假唤醒 (Spurious wakeup)

虚假唤醒描述了使用某些多线程API(如POSIX线程和Windows API)提供的条件变量的复杂情况。即使在一个条件变量似乎已从等待线程的角度发出信号后,所等待的条件仍可能是错误的。其中一个原因是虚假唤醒; 也就是说,即使没有线程发信号通知条件变量,线程也可能从其等待状态中唤醒。为了正确,有必要在线程完成等待之后验证条件是否为真。由于虚假唤醒可能会重复发生,因此可以通过等待条件为真时终止的循环来...

2018-06-20 16:58:50 1898

原创 Linux线程同步——条件变量

条件变量变量也是出自POSIX线程标准,另一种线程同步机制,。主要用来等待某个条件的发生。可以用来同步同一进程中的各个线程。当然如果一个条件变量存放在多个进程共享的某个内存区中,那么还可以通过条件变量来进行进程间的同步。每个条件变量总是和一个互斥量相关联,条件本身是由互斥量保护的,线程在改变条件状态之间必须要锁住互斥量。条件变量相对于互斥量最大的优点在于允许线程以无竞争的方式等待条件的发生。当一个...

2018-06-18 22:12:06 156

原创 Linux进程间通信——信号量

信号量此处只涉及利用“二进制信号量”(只用0和1)完成“控制线程顺序”为中心的同步方法。信号量的创建和销毁函数:pshared参数超出我们关注的范围,默认向其传递0. 信号量相当于互斥量lock,unlock的函数: 调用sem_init函数时,操作系统将创建信号量对象,此对象中记录着“信号量值”整数。该值在调用sem_post函数时增1,调用sem_wait函数时减1。信号量的值不能小于0,当信...

2018-06-18 20:48:10 267

原创 TCP/IP通信案例:访问Internet上的Web服务器

Web客户端和服务器之间使用HTTP协议通信。 HTTP代理服务器的工作原理在HTTP通信链上,客户端和目标服务器之间通常存在某些中转代理服务器,它们提供对目标资源的中转访问。一个HTTP请求可能被多个代理服务器转发,后面的服务器称为前面服务器上的上游服务器。代理服务器按照其使用方式和作用,分为正向代理服务器,反向代理服务器和透明代理服务器。 正向代理:要求客户端自己设置代理服务器的地址。客户的每...

2018-06-11 23:15:09 3294

原创 TCP协议详解

TCP头部结构  16位端口号:告知主机该报文段的源端口和目的端口。32位序号:一次TCP通信过程中某一个传输方向上的字节流的每个字节的编号。32位确认号:用作对另一方发送来的TCP报文段的相应。其值是收到的TCP报文段的序号值加1。4位头部长度:标示该TCP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以TCP头部最长是60字节。6位标志位: ....................

2018-06-11 23:15:03 214

原创 IP协议详解

从两个方面讨论IP协议:1.IP头部信息。用于指定IP通信的源端IP地址,目的端IP地址,指导IP分片和重组以及指定部分通信行为。2.IP数据报的路由和转发。 IPv4头部结构               IP路由                                当IP模块接收到来自数据链路层的IP数据报时,首先对该数据报的头部做CRC校验,确认无误之后就分析其头部的具体信息。若该I...

2018-06-11 23:14:52 256

原创 TCP/IP协议族

数据链路层:两个常用的协议是ARP协议(地址解析协议)和RARP协议,实现IP地址和机器物理地址(MAC地址)的转换。网络层使用IP地址寻找机器,而数据链路层使用物理地址寻找机器,因此网络层必须先将IP地址转化成其物理地址。网络层:实现数据包的选路和转发。网络层最核心的协议是IP协议,IP协议根据数据包的目的IP地址来决定如何投递它。传输层:为两台主机上的应用程序提供端到端的通信。传输层只关心...

2018-06-11 23:14:42 436

原创 mutex和lock_guard,muduo网络库的MutexLock 与MutexLockGuard

互斥锁是用来保护一段临界区的,它可以保证某段时间内只有一个线程在执行一段代码或者访问某个资源。 C++11的mutex和lock_guard C++11新增了mutex,使用方法和linux底下的常用使用方法差不多。先使用std::mutex 定义一个互斥锁,例如std::mutex XXXmutex在需要使用互斥锁的时候,使用XXXmutex.lock();上锁,以及使用XXXmutex.unl...

2018-06-08 16:33:11 873

原创 Linux终极shell-zsh的完美配置方案!——oh-my-zsh

Zsh 介绍Zsh 兼容 Bash,据传说 99% 的 Bash 操作 和 Zsh 是相同的Zsh 官网:http://www.zsh.org/先看下你的 Linux支持哪些 shell:cat /etc/shells,正常结果应该是这样的:/bin/sh/bin/bash/sbin/nologin/bin/dash/bin/tcsh/bin/csh默认 CentOS / Ubuntu ...

2018-06-07 23:59:17 86478 5

原创 Vim的终极配置方案,完美的写代码界面! ——.vimrc

先秀一下我的Vim界面语法补全我用的是YouCompleteMe, 有目录树插件,taglist插件等。通过插件管理器Vundle来进行安装,具体方法自行百度。背景可以通过换张自己喜爱的壁纸,然后调终端的透明度,就可以对着自己喜爱的场景编程啦~有语法高亮,语句补全,显示行号,自动缩进等等功能。还有创建源文件自动添加头文件的功能,例如写一个.c程序自动添加...

2018-06-07 23:40:51 324668 53

原创 条款04: 确定对象被使用前已先被初始化

最佳处理方法:永远在使用对象之前先将它初始化.int x = 0; const char* text = "A C-style string";double d;std::cin >> d; 对于构造函数:确保每一个构造函数都将对象的每一个成员初始化。//区分赋值和初始化 例如以下构造函数:AB::AB(const std::string& name, con...

2018-06-07 16:59:55 351

原创 条款03: 尽可能使用const

面对指针:-若关键字出现在 * 左边,表示被指物是常量(但可以通过其它途径改变被值对象的值,不能通过此指针改变) 若关键字出现在 * 右边,表示指针自身是常量; 若出现在两边,表示被植物和指针两者都是常量 若被指物是常量,有两种写法,意义相同:void f1(const Widget* pw);void f2(Widget const * pw); 迭代器的作用就像个T* 指针。声明迭代器为co...

2018-06-07 16:57:08 165

原创 为什么多线程读写 shared_ptr 要加锁? --shared_ptr的线程安全性

在《Linux 多线程服务端编程:使用 muduo C++ 网络库》第 1.9 节“再论 shared_ptr 的线程安全”中写道:(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_...

2018-06-06 17:51:04 1030

原创 条款02:尽量以const,enum,inline替换成#define

当使用#define时:#define AS 1.65记号名称AS从未被编译器看见,若运行此常量得到一个编译错误信息时,这个错误信息提到1.65而不是AS. 解决方法是:用一个常量替换宏(#define):const double AS = 1.65;作为语言常量,AS肯定会被编译器看到,当然就会进入记号表. 以常量替换#define两种特殊情况:1.定义常量指针,有必要将指针const。若要定...

2018-06-05 23:57:24 170

原创 条款01: 视C++为一个语言联邦

C++的主要的四个次语言:-C。C++仍是以C为基础:区块(blocks),语句(statements),预处理器(preprocessor),内置数据类型(built-in data types),数组(array),指针(pointers)-Object-Oriented C++。这部分是C with Classes所述求的:classes(包括构造函数和析构函数),封装(encapsulat...

2018-06-05 23:52:26 298

原创 C++继承中的重载,覆盖和隐藏

谈谈C++继承中的重载,覆盖和隐藏      写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide)。  我们先来看一些代码及其编译结果。  实例一:    #include "stdafx.h"  #include <iostream.h>  class CB  {  public:     void f(int)     { ...

2018-06-04 22:09:05 454

空空如也

空空如也

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

TA关注的人

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