c++多线程编程——初探
c++多线程并发可以帮助我们挖掘CPU的性能,在我们的思想中,似乎程序都是顺序执行的。这样的结论是建立在:程序是单线程程序。(比如我们平时写的hello world程序)。
但是如果程序是多线程的。那么这个结论就不成立了。先上代码:
#include <iostream>
#include <thread>
#include <chrono> void foo()
{
std::cout << "foo is started\n";
std::this_thread::sleep_for(std::chrono::seconds());
std::cout << "foo is done\n";
} void bar()
{
std::cout << "bar is started\n";
std::this_thread::sleep_for(std::chrono::seconds());
std::cout << "bar is done\n";
} int main()
{
std::cout << "starting first helper...\n";
std::thread helper1(foo);
//std::cout << "thread helper1's ID:" << std::hex << helper1.get_id() <<std::endl; std::cout << "starting second helper...\n";
std::thread helper2(bar);
//std::cout << "thread helper1's ID:" << std::hex << helper2.get_id() << std::endl; std::cout << "waiting for helpers to finish...\n" << std::endl;
helper1.join();
helper2.join();
std::cout << "done!\n";
system("pause");
}
程序中: #include <thread>包含了线程类thread,例如程序的22行,就创建了新的线程 helper1,也就是创建新的线程是通过创建线程对象来实现的。也就是:main函数开始,就建立了一个线程,但是这里 又新开辟了一个独立的线程,而26行所示代码则又开辟了一个新的线程helper2。我们来直观看一下,这个程序的结果是什么:

可以看到,程序并没有在函数foo执行完毕后才执行bar,看起来更像是这两个线程是同时执行的(你可以去掉创建线程,然后就写普通的单线程调用实例来看看结果有何不同)
在此,总结三点:
1.多线程编程可以使得程序能够并发执行
2.多线程创建是通过thread类创建新的对象,也就是一个线程对象就表示为一个新的线程。
3.一个线程被销毁之前(析构函数被调用之前),必须要先结束该线程,这里的方式是join()方法,该方法会阻塞后续线程的执行。(也就是该线程不执行完,后续无法执行,当然也可以采用非阻塞的方式detach)
关于对多线程并发编程,更多的需要参考下面这位博主的文章:https://www.cnblogs.com/wangguchangqing/p/6134635.html,这篇文章形象而细致的介绍了初步的多线程编程。
c++多线程编程——初探的更多相关文章
- Linux多线程编程初探
Linux线程介绍 进程与线程 典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情.有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程 ...
- 多线程编程初探——OO第二单元作业回顾
一.作业设计策略 1)执行FAFS策略的单部电梯 由于对多线程不是很了解,于是采用了理论课上介绍的生产者消费者模型作为设计模板(也是很多同学一开始的做法):将请求队列作为共享对象(托盘),名为In ...
- Web Worker javascript多线程编程(一)
什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...
- Web Worker javascript多线程编程(二)
Web Worker javascript多线程编程(一)中提到有两种Web Worker:专用线程dedicated web worker,以及共享线程shared web worker.不过主要讲 ...
- windows多线程编程实现 简单(1)
内容:实现win32下的最基本多线程编程 使用函数: #CreateThread# 创建线程 HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpT ...
- Rust语言的多线程编程
我写这篇短文的时候,正值Rust1.0发布不久,严格来说这是一门兼具C语言的执行效率和Java的开发效率的强大语言,它的所有权机制竟然让你无法写出线程不安全的代码,它是一门可以用来写操作系统的系统级语 ...
- windows多线程编程星球(一)
以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...
- Java多线程编程核心技术---学习分享
继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...
- python多线程编程
Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...
随机推荐
- Flutter开发之Widget布局和页面导航
一.水平布局Row Row控件可以分为非灵活排列和灵活排列两种,灵活的可以在外边加入Expanded使用 两者混用: import 'package:flutter/material.dart'; v ...
- 搭建 Kubernetes 集群
1.节点规划 master节点:192.168.188.135 node 节点:(node1)192.168.188.136,(node2)192.168.188.137 2.禁用SELinux ...
- Python3(十) 函数式编程: 匿名函数、高阶函数、装饰器
一.匿名函数 1.定义:定义函数的时候不需要定义函数名 2.具体例子: #普通函数 def add(x,y): return x + y #匿名函数 lambda x,y: x + y 调用匿名函数: ...
- Matplotlib数据可视化(1):入门介绍
1 matplot入门指南¶ matplotlib是Python科学计算中使用最多的一个可视化库,功能丰富,提供了非常多的可视化方案,基本能够满足各种场景下的数据可视化需求.但功能丰富从另一方面来 ...
- Java压缩包(zip)【学习笔记】
前言 Java实现Zip压缩解压可以使用JDK的原生类java.util.zip,但是JDK 7 之前存在中文文件名乱码问题. 使用 ant.jar 的org.apache.tools.zip包,可以 ...
- k8s pod时区更改
一.问题所在 在K8S里启动一个容器,该容器的设置的时区是UTC0,但是对于很多客户而言,其主机环境并不在UTC0.例如中国客户在UTC8.如果不把容器的时区和主机主机设置为一致,则在查找日志等时候将 ...
- zabbix-server配置文件详解
zabbix官方文档:https://www.zabbix.com/documentation/4.0/zh/manual zabbix-server端的配置文件在/etc/zabbix/zabbix ...
- [Python]判断变量类型是否为List列表
用法:isinstance(变量,list) li = [1,2,3] print(type(li)) if isinstance(li,list): print("This is a Li ...
- 自己用C语言写RH850 F1L serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 由于有了RH850 F ...
- linux使用和基础操作
1.linux系统初使用 linux有图形终端和字符终端,关于linux学习以字符终端为主,即命令行操作: [root@centos7 ~]#runlevel 查看当前工作模式N 3 //3为字符终端 ...