先总结延申以下前面(一)所讲的内容。

主线程从main()函数开始执行,我们创建的线程也需要一个函数作为入口开始执行,所以第一步先初始化函数。

整个进程是否执行完毕的标志是主线程是否执行完毕,一般情况下,如果想要保持子线程的运行状态,那么要主线程保持运行。

本章从两方面介绍创建线程的方法:

一、用函数创建线程:

关键词:thread(类),join() ,detach(),joinable().

join(),阻塞主线程,等待子线程执行完毕后,才到主线程执行。

detach(),分离主线程,主线程和子线程各走各的,所以会出现多次运行会发现,运行结果可能不同,这时候需要考虑一个问题,主线程如果执行完了,子线程还没跑完,这就可能出现一定问题了。

joinable(),判断是否使用了join()或者detach(),是返回false,否返回true。

注意:join()和detach()不能同时使用,这两个函数本来就有互斥的关系。

 #include <iostream>
#include <thread>
void my_thread()
{
for (int i = ; i <= ; i++)
{
cout << "my_thread" << i << endl;
}
}
int main()
{
thread my_threadObj(my_thread); //创建一个子线程,并传入子线程的函数入口my_thread
if (my_threadObj.joinable()) //返回true代表没有使用join()或者detch()
{
my_threadObj.join(); //阻塞主线程,并让主线程等待子线程执行完
}
else
{
return -;
}
//my_threadObj.detach(); //分离主线程,子线程与主线程各自运行,所以每次运行结果可能不同
for (int i = ; i <=; i++)
{
cout << "main_thread" << i << endl;
}
return ;
}

二、其他方法创建线程

1.用类对象

一旦用了detach()将子线程和主线程分离开,那么主线程执行完后,对象ca已经被销毁,但实际上在子线程上的对象并不是ca,而是ca的拷贝对象,它并没有被销毁,还存在与子线程中。

 class CA
{
public:
void operator()()
{
cout << "my_thread1" << endl;
cout << "my_thread2" << endl;
cout << "my_thread3" << endl;
cout << "my_thread4" << endl;
cout << "my_thread5" << endl;
}
CA()
{
cout << "调用构造函数" << endl;
}
CA(const CA&a)
{
cout << "调用拷贝构造函数" << endl;
}
~CA()
{
cout << "调用析构函数" << endl;
}
};
int main()
{
CA ca;
thread my_threadObj(ca); //创建一个子线程,可调用对象为ca
if (my_threadObj.joinable()) //返回true代表没有使用join()或者detch()
{
my_threadObj.join(); //阻塞主线程,并让主线程等待子线程执行完
}
for (int i = ; i <= ; i++)
{
cout << "main_thread" << i << endl;
}
return ;
}

2.用lambda表达式

 int main()
{
auto mylabda_thread = []
{
for (int i = ; i <= ; i++)
{
cout << "mythread" << i << endl;
}
};
thread mythreadObj(mylabda_thread);
mythreadObj.detach();
for (int i = ; i <= ; i++)
{
cout << "main_thread" << i << endl;
}
return ;
}

C++多线程基础学习笔记(二)的更多相关文章

  1. Java基础学习笔记二十一 多线程

    多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...

  2. Java基础学习笔记二十八 管家婆综合项目

    本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添 ...

  3. javascript第二遍基础学习笔记(二)

    一.操作符 1.一元操作符: 自加自减(分前置和后置2种):++.-- 区别:前置的先自加或自减,后进行计算:而后置的是先进行计算,后自加或自减(在其会产生负面影响时才能体现区别): ; i++; / ...

  4. Java基础学习笔记二十二 网络编程

    络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规则 ...

  5. Java基础学习笔记二十五 MySQL

    MySQL 在dos中操作mysql 连接mysql命令: mysql -uroot -p密码 ,连接OK,会出现mysql> 对数据库的操作 创建一个库 create database 库名 ...

  6. Java基础学习笔记二十六 JDBC

    什么是JDBC JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库.原来我们操作数据库是在控制台使用SQL语句来操作数据库,J ...

  7. 使用JSP实现输出(web基础学习笔记二)

    Jsp:Java Server Page 服务器端的Java页面,动态网页技术 jsp注释 显式注释:这种注释客户端是允许看见的;<!--html注释--> 隐式注释:这种注释客户端是看不 ...

  8. C++多线程基础学习笔记(四)

    一.创建多个子线程 前面三章讲的例子都是只有一个子线程和主线程,然而实际中有多个子线程.那么下面介绍如何创建多个子线程. #include <iostream> #include < ...

  9. Java基础学习笔记二 Java基础语法

    注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /* 这是 * 一段注释, * 它跨越了多个行 */ public vo ...

随机推荐

  1. 2017FJ省队集训 游记

    2017FJ省队集训 游记 又是一篇流水账 Day 1 今天是省队集训的第一天.早上骑车去八中,到的时候汗流太多浑身湿透被杨哥哥和runzhe2000 d了,一个说我去游泳了一个说我打球了...流完汗 ...

  2. 灰度图像--图像增强 非锐化掩蔽 (Unsharpening Mask)

    学习DIP第35天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...

  3. python3网络编程

    网络编程(定义) 网络编程的本质就是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机,数据传递本身 没有多大难度,不就是把一个设备中的数据发送给一个设备,然后接收另一个设备的反馈的数据. ...

  4. JS 浏览器地址栏传递参数,参数加密/解密(编码/解码)

    我们有时候在JS里进行页面跳转,并且传递了参数(AppName),如下: window.location = "../../views/form/edit.html?AppName=新增&q ...

  5. vue 2.x 的 v-bind 指令的 .prop 事件修饰符详解

    vue 官方文档对 .prop 修饰符的解释是: 使用例子: 那么,具体的原理和用法是什么呢?这要从 html 的 DOM node 说起. 在 html 标签里,我们可以定义各种 attribute ...

  6. Java - 可循环队列

    队列是一种特殊的线性表,是一种先进先出的数据结构.只允许在表的前端进行删除操作,在表的后端进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列. 简单的循环队 ...

  7. How to Fix Grub error: no such partition Grub Rescue

    错误信息: error: no such partition Entering rescue mode... grub rescue> _ 错误原因: grub找不到文件normal.mod 解 ...

  8. 安装指定版本的Ionic或Cordova

    安装ionic 及 cordova npm install -g cordova ionic更新命令 npm update -g cordova ionic安装特定版本 npm install -g ...

  9. Numpy数据类型转化astype,dtype

    1. 查看数据类型 import numpy as np arr = np.array([1,2,3,4,5]) print(arr) [1 2 3 4 5] # dtype用来查看数据类型 arr. ...

  10. tensorflow神经网络与单层手写字识别

    1.知识点 """ 1.基础知识: 1.神经网络结构:1.输入层 2.隐含层 3.全连接层(类别个数=全连接层神经元个数)+softmax函数 4.输出层 2.逻辑回归: ...