DREAM OF TECHNICAL ACHIEVEMENT

0%

什么是线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。

同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
一个进程可以有很多线程,每条线程并行执行不同的任务。

阅读全文 »

程序和进程

  • 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu、内存、打开的文件、设备、锁….)

  • 进程,是一个抽象的概念,与操作系统原理联系紧密。进程是活跃的程序,占用系统资源。在内存中执行。(程序运行起来,产生一个进程)

程序 → 剧本(纸)

进程 → 戏(舞台、演员、灯光、道具…)

同一个剧本可以在多个舞台同时上演。同样,同一个程序也可以加载为不同的进程(彼此之间互不影响)

如:同时开两个终端。各自都有一个bash但彼此ID不同。

并发

并发,在操作系统中,一个时间段中有多个进程都处于已启动运行到运行完毕之间的状态。但,任一个时刻点上仍只有一个进程在运行。

例如,当下,我们使用计算机时可以边听音乐边聊天边上网。 若笼统的将他们均看做一个进程的话,为什么可以同时运行呢,因为并发。

分时复用cpu

单道程序设计

阅读全文 »

map/multimap的简介

  • map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对。它提供基于key的快速检索能力。
  • map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
  • map的具体实现采用红黑树变体的平衡二叉树的数据结构。在插入操作和删除操作上比vector快。
  • map可以直接存取key所对应的value,支持[]操作符,如map[key]=value。
  • multimap与map的区别:map支持唯一键值,每个键只能出现一次;而multimap中相同键可以出现多次。multimap不支持[]操作符。

头文件 #include <map>

map and multimaps

map/multimap采用模板类实现,对象的默认构造形式:

阅读全文 »

set/multiset的简介

  • set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
    set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。
  • set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。
  • multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次。
  • 不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。

头文件 #include <set>

图解

set/multiset对象的默认构造

  • set<int> setInt; //一个存放int的set容器。
  • set<float> setFloat; //一个存放float的set容器。
  • set<string> setString; //一个存放string的set容器。
  • multiset<int> mulsetInt; //一个存放int的multi set容器。
  • multi set<float> multisetFloat; //一个存放float的multi set容器。
  • multi set<string> multisetString; //一个存放string的multi set容器。
阅读全文 »

List简介

  • list是一个双向链表容器,可高效地进行插入删除元素。
  • list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符。It++(ok) it+5(err)

头文件 #include <list>

list对象的默认构造

list采用采用模板类实现,对象的默认构造形式:list<T> lstT;
如:

  • list<int> lstInt; //定义一个存放int的list容器。
  • list<float> lstFloat; //定义一个存放float的list容器。
  • list<string> lstString; //定义一个存放string的list容器。
  • list<xxxx> lstXxxx; //定义一个存放xxxx的list容器。
阅读全文 »

Queue简介

queue是队列容器,是一种“先进先出”的容器。

头文件 #include <queue>

queue对象的默认构造

queue采用模板类实现,queue对象的默认构造形式:queue<T> queT;
如:

  • queue<int> queInt; //一个存放int的queue容器。
  • queue<float> queFloat; //一个存放float的queue容器。
  • queue<string> queString; //一个存放string的queue容器。
  • queue<xxxx> queXxxx; //一个存放xxxx的queue容器。

尖括号内还可以设置指针类型或自定义类型。

阅读全文 »

Stack简介

  • stack是堆栈容器,是一种“先进后出”的容器。
  • stack是简单地装饰deque容器而成为另外的一种容器。

头文件 #include <stack>

stack对象的默认构造

stack采用模板类实现, stack对象的默认构造形式: stack <T> stkT;

  • stack <int> stkInt; //一个存放int的stack容器。
  • stack <float> stkFloat; //一个存放float的stack容器。
  • stack <string> stkString; //一个存放string的stack容器。
  • stack <xxx> xxx; //尖括号内还可以设置指针类型或自定义类型。
阅读全文 »

Deque简介

  • deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的。
  • deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
  • deque可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲)。
  • deque头部和尾部添加或移除元素都非常快速。但是在中部安插元素或移除元素比较费时。

头文件#include <deque>

deque对象的默认构造

deque采用模板类实现,deque对象的默认构造形式:deque<T> deqT;

1
2
3
4
deque <int> deqInt;            //一个存放int的deque容器。
deque <float> deq Float; //一个存放float的deque容器。
deque <string> deq String; //一个存放string的deque容器。
deque <xxx> deq xxx; //尖括号内还可以设置指针类型或自定义类型。
阅读全文 »

Vector容器

Vector容器简介

  • vector是将元素置于一个动态数组中加以管理的容器。
  • vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法)。
  • vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时

vector对象的默认构造

vector采用模板类实现,vector对象的默认构造形式

  • vector<T> vecT;
  • vector<int> vecInt; //一个存放int的vector容器。
  • vector<float> vecFloat; //一个存放float的vector容器。
  • vector<string> vecString; //一个存放string的vector容器。
  • vector<xxx> vecXxx; //尖括号内还可以设置指针类型或自定义类型。
阅读全文 »

String概念

string是STL的字符串类型,通常用来表示字符串。而在使用string之前,字符串通常是用char表示的。string与char都可以用来表示字符串,那么二者有什么区别呢。

string和char*的比较

  • string是一个类, char*是一个指向字符的指针。
  • string封装了char,管理这个字符串,是一个char型的容器。
  • string不用考虑内存释放和越界。
  • string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。
  • string提供了一系列的字符串操作函数.查找find,拷贝copy,删除erase,替换replace,插入insert

string的构造函数

默认构造函数:

  • string(); //构造一个空的字符串string s1。
阅读全文 »