并发、进程、可执行程序、进程、线程的基本概念

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()

并发、线程的基本概念&线程启动结束的更多相关文章

  1. 原创】Java并发编程系列2:线程概念与基础操作

    [原创]Java并发编程系列2:线程概念与基础操作 伟大的理想只有经过忘我的斗争和牺牲才能胜利实现. 本篇为[Dali王的技术博客]Java并发编程系列第二篇,讲讲有关线程的那些事儿.主要内容是如下这 ...

  2. java 并发性和多线程 -- 读感 (一 线程的基本概念部分)

    1.目录略览      线程的基本概念:介绍线程的优点,代价,并发编程的模型.如何创建运行java 线程.      线程间通讯的机制:竞态条件与临界区,线程安全和共享资源与不可变性.java内存模型 ...

  3. Java并发编程——线程的基本概念和创建

    一.线程的基本概念: 1.什么是进程.什么是是线程.多线程? 进程:一个正在运行的程序(程序进入内存运行就变成了一个进程).比如QQ程序就是一个进程. 线程:线程是进程中的一个执行单元,负责当前进程中 ...

  4. Java并发编程:什么是线程安全,以及并发必须知道的几个概念

    废话 众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的.为了追求成为一个好的Java程序员,我决定从今天开始死磕Jav ...

  5. java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)

    今天开始就来总结一下Java多线程的基础知识点,下面是本篇的主要内容(大部分知识点参考java核心技术卷1): 1.什么是线程以及多线程与进程的区别 2.多线程的创建与启动 3.中断线程和守护线程以及 ...

  6. Java 并发编程——Executor框架和线程池原理

    Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...

  7. 线程概念( 线程的特点,进程与线程的关系, 线程和python理论知识,线程的创建)

    参考博客: https://www.cnblogs.com/xiao987334176/p/9041318.html 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运 ...

  8. Java并发编程:4种线程池和缓冲队列BlockingQueue

    一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池.使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动 ...

  9. [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors

    [Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...

随机推荐

  1. Web安全之CSRF攻击(转载)

    CSRF是什么? CSRF(Cross Site Request Forgery),中文是跨站点请求伪造.CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任, ...

  2. [系列] Go - chan 通道

    目录 概述 声明 chan 写入 chan 读取 chan 关闭 chan 示例 推荐阅读 概述 原来分享基础语法的时候,还未分享过 chan 通道,这次把它补上. chan 可以理解为队列,遵循先进 ...

  3. Python—推导式

    推导式 推导式:comprehensions(又称解析式),是Python的一种独有特性,相当于语法糖的存在,推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2 ...

  4. QQ第三方登录逻辑(微信,微博等同)

    实现过程:生成qq扫码登录连接(需要注册,链接里有几个参数需要按照开发文档的格式进行拼接,要后端完成),点击QQ登录按钮,前端Vue发送axios请求,后端收到请求把生成的QQ登录链接发送给vue,v ...

  5. Java Grammer:数据类型

    Java的数据类型 我们知道,Java是一种强类型语言,类型对于Java语言来说非常的重要不言而喻,在Java中,分为基础数据类型和引用数据类型,其中基础数据类型分为了四类八种: 下面,我们来分别说一 ...

  6. 佳木斯集训Day8

    本来能AK的啊啊啊啊啊,唯一一天可以AK,却被Champion误导了(好吧实际上是我理解有问题) T1我写了俩小时,就是一道数列题,推公式的,可以二分解,我觉得二分麻烦,就直接想O(1)了 #incl ...

  7. 跟着大彬读源码 - Redis 10 - 对象编码之整数集合

    [TOC] 整数集合是 Redis 集合键的底层实现之一.当一个集合只包含整数值元素,并且元素数量不多时,Redis 就会使用整数集合作为集合键的底层实现. 1 整数集合的实现 整数集合是 Redis ...

  8. SpringBoot:Mybatis + Druid 数据访问

    西部开源-秦疆老师:基于SpringBoot 2.1.7 的博客教程 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! 简介 对于数据访问层 ...

  9. SpringBoot分布式:Dubbo+zookeeper

    西部开源-秦疆老师:SpringBoot + Dubbo + zookeeper 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! 基础知识 ...

  10. 面试java后端面经_1

    1 自我介绍(建议提前准备:没准备的可以这样说:来自某学校 姓名 专业 学的啥 为啥学 自己陆陆续续开发的项目 毕业将近 找工作 在哪看到贵公司的招聘 准备了啥 大概这样) 例子:您好!我是来自XXX ...