并发、线程的基本概念&线程启动结束
并发、进程、可执行程序、进程、线程的基本概念
1.并发
并发当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。每次切换需要额外的开销(保存运行状态、还原现场)占用程序运行时间。线程的数量过多效率反而下降。
2.并行
当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行。
3.可执行程序
一个文件,windows下以.com或.exe为后缀,liunx,ls -la,rwxrwxrwx(x执行权限)
4.进程
计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。(可执行程序运行起来)
5.线程
又叫轻量进程,是程序执行流的最小单元。每一个进程有一个主线程,可以有多个线程。一个进程内的线程共享内存(全局变量、指针、引用可在线程间传递,开销小于多进程,但是会造成数据一致性的问题)。
线程启动结束
主线程从main()函数开始,自己创建的线程也需要从一个函数开始执行,这个函数执行完成,则线程消亡。
如果主线程结束,进程结束,一般情况下该进程的所有线程结束。
thread:标准库里的一个类
join() (汇合)
join:阻塞主线,让主线程等待子线程执行完毕
用函数
#include<iostream>
#include<thread>
using namespace std;
void print()
{
cout<<"子线程开始"<<endl;
cout<<"子线程结束"<<endl;
}
int main()
{
thread myThread(print); //创建线程(入口为print())
myThread.join(); //阻塞主线程 等待子线程执行完成
cout<<"主线程结束"<<endl;
return 0;
}
用类对象
#include<iostream>
#include<thread>
using namespace std;
class TA
{
public:
void operator()() //重载(),不能带参数
{
cout<<"子线程开始"<<endl;
cout<<"子线程结束"<<endl;
}
};
int main()
{
TA ta;
thread myThread(ta); //传入可调用对象
myThread.join(); //阻塞主线程 等待子线程执行完成
cout<<"主线程结束"<<endl;
return 0;
}
用lambda表达式
#include<iostream>
#include<thread>
using namespace std;
int main()
{
auto my = []{
cout<<"子线程"<<endl;
};
thread myThread(my); //传入可调用对象
myThread.join();
return 0;
}
如果去掉myThread.join();可能会出现主线程执行完后子线程未执行完成。
detach() (分离)
detach:主线程和子线程分离,主线程可以先执行完成,不用和子线程汇合。
detach后主线程关联和thread对象会与主线程失去关联,子线程会到后台运行。
以下程序有一个坑点!!!
在用detach()时,当主线程执行完成后,类中值引用的主线程局部对象val将会被回收,但是子线程依然要打印val的值,此时程序时错误的!(引用,指针局部对象)
创建子线程中的局部的类对象是被复制到线程中去的,所以没有问题。
#include<iostream>
#include<thread>
using namespace std;
class TA
{
public:
int &val;
TA(int &val):val(val){}
void operator()() //重载(),不能带参数
{
cout<<val<<endl;
}
};
int main()
{
int val=100;
TA ta(val);
thread myThread(ta); //传入可调用对象
myThread.detach();
return 0;
}
joinable()
判断是否能join()或detach()
并发、线程的基本概念&线程启动结束的更多相关文章
- 原创】Java并发编程系列2:线程概念与基础操作
[原创]Java并发编程系列2:线程概念与基础操作 伟大的理想只有经过忘我的斗争和牺牲才能胜利实现. 本篇为[Dali王的技术博客]Java并发编程系列第二篇,讲讲有关线程的那些事儿.主要内容是如下这 ...
- java 并发性和多线程 -- 读感 (一 线程的基本概念部分)
1.目录略览 线程的基本概念:介绍线程的优点,代价,并发编程的模型.如何创建运行java 线程. 线程间通讯的机制:竞态条件与临界区,线程安全和共享资源与不可变性.java内存模型 ...
- Java并发编程——线程的基本概念和创建
一.线程的基本概念: 1.什么是进程.什么是是线程.多线程? 进程:一个正在运行的程序(程序进入内存运行就变成了一个进程).比如QQ程序就是一个进程. 线程:线程是进程中的一个执行单元,负责当前进程中 ...
- Java并发编程:什么是线程安全,以及并发必须知道的几个概念
废话 众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的.为了追求成为一个好的Java程序员,我决定从今天开始死磕Jav ...
- java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)
今天开始就来总结一下Java多线程的基础知识点,下面是本篇的主要内容(大部分知识点参考java核心技术卷1): 1.什么是线程以及多线程与进程的区别 2.多线程的创建与启动 3.中断线程和守护线程以及 ...
- Java 并发编程——Executor框架和线程池原理
Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...
- 线程概念( 线程的特点,进程与线程的关系, 线程和python理论知识,线程的创建)
参考博客: https://www.cnblogs.com/xiao987334176/p/9041318.html 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运 ...
- Java并发编程:4种线程池和缓冲队列BlockingQueue
一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池.使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动 ...
- [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors
[Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...
随机推荐
- 深入理解JVM-java字节码文件结构剖析(1)
public class MyTest1 { private int a = 1; public int getA() { return a; } public void setA(int a) { ...
- 证明线程池ThreadPoolExecutor的核心线程数,最大线程数,队列长度的关系
关于线程池的几个参数,很多人不是很清楚如何配置,他们之间是什么关系,我用代码来证明一下. package www.itbac.com; import java.util.concurrent.*; p ...
- codeforces1088D_Ehab and another another xor problem交互题
传送门 一道考验思维的交互题 大致思路就是从最高的二进制位向下询问 代入例子比如: 5 6 6 5 7 4 6 4 讨论一下 交互题的重点学会推理和归纳 #include <bits/stdc+ ...
- 转载 | 一种让超大banner图片不拉伸、全屏宽、居中显示的方法
现在很多网站的Banner图片都是全屏宽度的,这样的网站看起来显得很大气.这种Banner一般都是做一张很大的图片,然后在不同分辨率下都是显示图片的中间部分.实现方法如下: <html> ...
- 程序员修神之路--用NOSql给高并发系统加速(送书)
随着互联网大潮的到来,越来越多网站,应用系统需要海量数据的支撑,高并发.低延迟.高可用.高扩展等要求在传统的关系型数据库中已经得不到满足,或者说关系型数据库应对这些需求已经显得力不从心了.关系型数据库 ...
- 洛谷 P1196 [NOI2002]银河英雄传说
题意简述 有30000列,每列都有一艘战舰,编号1~30000 有2种操作: 1.将一列的战舰运到另一列 2.询问两个战舰是否在同一列,如果是,求出它们之间的距离 题解思路 并查集, 维护每个点x离自 ...
- c#小灶——自动类型转换和强制类型转换
前面已经认识了不同的数据类型,你们有没有尝试过让不同的数据类型进行运算呢? ; double b = a; Console.WriteLine(b); 运行结果是:1 我们把一个整型的变量赋值给了一个 ...
- 使用 php 内部web服务器
使用 php 内部web服务器如网站目录 d:\web\index.php1.打开命令窗口,输入下列3条命令cd d:cd d:\web\index.phpphp -S localhost:80802 ...
- 从0到1发布一个npm包
从0到1发布一个npm包 author: @TiffanysBear 最近在项目业务中有遇到一些问题,一些通用的方法或者封装的模块在PC.WAP甚至是APP中都需要使用,但是对于业务的PC.WAP.A ...
- Unity进阶之ET网络游戏开发框架 08-深入登录成功消息
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...