What is thread?

In computer science, a thread of execution is the smallest sequence of programmed instructions that can be managed independently by ascheduler, which is typically a part of theoperating system.
--wikipedia

简单的说线程是一种可被调度的最小指令序列。更重要的是,线程是操作系统的一部分,不同的操作系统都会有着各自的定义和实现,并且多数情况下使用了不同的调度策略。

在当今的计算机世界中,多线程编程已经是一个极其重要,甚至在很多场景下是必不可少的编程模型。这些线程可以分享共同的系统资源,但是却可以各自独立执行。换个角度讲,线程给了计算机一个更接近现实世界的模型,因为我们就处在一个并发(concurrently)的世界。

Why we should use multi-thread?

多线程程序有着很多优点:

  • 快速响应:比如在一个单线程程序中,如果主线程block在一个费时的任务中(比如I/O操作),整个程序会“冻结”住,无法响应外界的输出。通过将交互任务与这个费时的任务独立成两个线程可以解决这个问题。但这并不是主要的用途,因为这种情况通过non-blocking I/O和Unix signal解决,并且带来更小的副作用。
  • 更好的性能:在现代计算机中,通常会有多个核心甚至多个CPU,通过多线程可以”更容易“使得多个核心并行(Parallel)执行。理解这句话很重要,很多人天真的以为单线程程序一定是在一个核心上运行,其实现代计算机的instruction pipelining和out-of-order execution打破了这个假设,CPU会对没有依赖关系的指令schedule到不同的核心上,来提高整体性能。

例如在Windows中通过CreateThread()创建进程,而在linux中使用POSIX thread模型,pthread_create()创建线程,并且在编译是要加入-pthread选项来表示正在使用POSIX thread库。可见,不同操作系统有着相似的线程概念,却包含这很多不同的实现细节。因此想要进行跨平台的多线程开发,就需要一种线程库作为thread wrapper。

Boost thread就是这样一种线程库,并且被加入到C++11标准中,它的使用很简单。下面是一个简单的例子:

#include <thread>void func()
{// do some work
}int main()
{std::thread t(func);t.join();return 0;
}

其中的.join()是用来同步线程的,该函数会一直阻塞直到thread完成。当然也可以通过detach来将线程执行和线程对象分离开,下面这段代码来自http://cppreference.com,可以很清晰的解释这个过程:

void independentThread()
{std::cout << "Starting concurrent thread.n";std::this_thread::sleep_for(std::chrono::seconds(2));std::cout << "Exiting concurrent thread.n";
}void threadCaller()
{std::cout << "Starting thread caller.n";std::thread t(independentThread);t.detach();std::this_thread::sleep_for(std::chrono::seconds(1));std::cout << "Exiting thread caller.n";
}int main()
{threadCaller();std::this_thread::sleep_for(std::chrono::seconds(5));
}

下面是输出结果:

Starting thread caller.
Starting concurrent thread.
Exiting thread caller.
Exiting concurrent thread

下一章中,我们简单介绍一下C++多线程开发中常见的lock。

多线程编程有什么用途_C++ 多线程编程 (一)相关推荐

  1. 3d游戏编程大师技巧 源代码_C/C++编程入门基础系列:俄罗斯方块小游戏制作,直接源代码分享...

    这篇文章主要为大家详细介绍了C语言实现俄罗斯方块小游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.要先下载一个 graphics.h 的头文件来绘图. 2.初始化窗口:initgraph( ...

  2. c#高级编程第11版 pdf网盘_c#高级编程_c#高级编程 目录 微盘_c#高级编程第10版 pdf...

    c#高级编程 C#高级编程(第9版)-C# 5.0 & .NET 4.5.1是由.NET专家的梦幻组合编写,包含开发人员使用C#所需的所有内容.C#是编写.NET应用程序的一种语言,本书适合于 ...

  3. 多线程编程有什么用途_为什么建议你一定要学懂C++

    虽然编程语言很多,但是选择C++绝对不会令人失望! 强大,灵活,复杂,C ++的起源可以追溯到40年前,但它仍然是当今使用最广泛的编程语言之一. 成功的程序员在以往的工作和生活中都曾经历过大大小小的不 ...

  4. [网络安全自学篇] 十五.Python攻防之多线程、C段扫描和数据库编程(二)

    这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步.前文分享了Python网络攻防相关基础知识,包括正则表达式.Web编程和套接字通信 ...

  5. muduo学习笔记 - 第3章 多线程服务器的适合场合与常用编程模型

    第3章 多线程服务器的适合场合与常用编程模型 3.1 基本概念 同步和异步 针对程序和内核的交互 同步:用户进程触发IO操作,等待或轮询的查看IO是否就绪 异步:用户进程触发IO操作,继续做自己的事情 ...

  6. 《Objective-C高级编程 iOS与OS X多线程和内存管理》读书笔记

    <Objective-C高级编程 iOS与OS X多线程和内存管理>读书笔记 第一章:自动引用计数 自己生成的对象,自己所持有. 非自己生成的对象,自己也能持有 不再需要自己持有的对象时释 ...

  7. Java多线程开发(一)Java多线程编程简介

    文章目录 参考 Java线程简介 Thread类构造方法和属性 常用Thread类方法 线程的生命周期 多线程编程的优势和风险 安全性问题 活跃性问题 性能问题 参考 [Java并发系列01]Thre ...

  8. python 复习——网络编程(三)——网络基础、多线程、ftp任务铺垫

    一.网络基础 学习网络编程,了解一些网络基础的知识是必不可少的,下面学习一些基础的网络知识: 1.我们的电脑里有网卡,网卡里有mac地址: 2.我到某个地方插上网线,路由器或交换机中的DHCP服务为我 ...

  9. 凸轮结构c语言编程,凸轮设计_c语言编程

    凸轮设计_c语言编程 (4页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 一.编程:(注:程序中各个符号的含义)PI:常数 s0:理论廓 ...

最新文章

  1. 大公司病(太现实了!)
  2. 20145234黄斐《信息安全系统设计基础》实验一
  3. 机虚拟磁盘附加到计算机上,解决在NAS的共享文件夹下的VHDX虚拟磁盘无法附加到系统...
  4. python字符串、列表和文件对象总结
  5. ubuntu安装迅雷软件
  6. 宝德服务器硬盘报警,宝德“超人”系列PR4880G
  7. CentOS下安装postgresql
  8. apache恢复服务器文件,apache服务器的配置文件是
  9. 电力设备巡检管理系统
  10. 高等数学(第七版)同济大学 习题1-7 个人解答
  11. 谈谈滞后补偿器与PI控制及其原理分析
  12. 颠倒Excel数据行顺序
  13. 游戏开发中的贝塞尔曲线,曲线和路径
  14. 明日之后维护服务器什么情况,明日之后无法连接服务器是什么原因
  15. 周易六十四卦——大畜卦
  16. python中使用python-dotenv管理环境变量
  17. 《质量总监成长记》笔记
  18. JVM -XX:MaxDirectMemorySize
  19. 天津达内:大数据自学可以学会吗
  20. 黑马程序员_java基础笔记(08)...GUI,网络编程,正则表达式

热门文章

  1. 全面综述:图像特征提取与匹配技术
  2. 如何通俗地讲解对偶问题?尤其是拉格朗日对偶lagrangian duality?
  3. python转换数据类型(int、float、str、eval、tuple、list、chr、ord、bin、oct、hex)
  4. RIP协议与OSPF协议与BGP协议
  5. 使用OpenCV对运动员的姿势进行检测
  6. 基于CNN的图像缺陷分类
  7. 2021研究生报告新鲜出炉!博士每年招生超10万人
  8. 链表问题20——按照左右半区的方式重新组合单链表
  9. ng-model 绑定checkbox 取不到值?
  10. 从Java到Spring为何独得青睐Spring Summit 2017不可不知的那些事儿