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

主线程从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. 灰度图像--图像增强 双边滤波 Bilateral Filtering

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

  2. JavaWeb-RESTful(二)_使用SpringMVC开发RESTful_上

    JavaWeb-RESTful(一)_RESTful初认识 传送门 JavaWeb-RESTful(二)_使用SpringMVC开发RESTful_上 传送门 JavaWeb-RESTful(三)_使 ...

  3. [BZOJ4033]:[HAOI2015]树上染色(树上DP)

    题目传送门 题目描述 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加 ...

  4. onReachBottom 注意事项

    onReachBottom使用注意 可在pages.json里定义具体页面底部的触发距离onReachBottomDistance,比如设为50,那么滚动页面到距离底部50px时,就会触发onReac ...

  5. [转]基于java的程序OutOfMemory问题的解决及Xms/Xmx/Xss的解释和应用

    长期以来一直都是做java应用的开发,所使用的开发工具基本上也都是基于java的,经常用的有eclipse, netbeans, ant, maven, cruisecontrol, tomcat, ...

  6. C# 实现DataTable、DataSet与XML互相转换

    /**//// <summary> /// 把DataSet.DataTable.DataView格式转换成XML字符串.XML文件 /// </summary> public ...

  7. Linux - 搭建Web项目(Django + nginx + uwsgi)

    工作中碰到需要使用Django + nginx + uwsgi 搭建项目环境 1. 搭建基本环境 需要有python环境,不多做说明 需要安装nginx,不多做说明 需要安装uwsgi: yum in ...

  8. Android studio 自动导入(全部)包 import (转)

    原文: https://blog.csdn.net/buaaroid/article/details/44979629 1.      Android studio 只有import单个包的快捷键:A ...

  9. 【例3】设有关系模式R(A, B, C, D, E)与它的函数依赖集F={A→BC, CD→E, B→D, E→A},求R的所有候选键。 解题思路:

    通过分析F发现,其所有的属性A.B.C.D.E都是LR类属性,没有L类.R类.N类属性. 因此,先从这些属性中依次取出一个属性,分别求它们的闭包:=ABCDE,=BD,=C,=D, =ABCDE.由于 ...

  10. python 学习笔记(一):在列表、字典、集合中根据条件筛选数据

    一.在列表中筛选数据 在列表中筛选出大于等于零的数据,一般通用的用法代码如下: data = [3, -9, 0, 1, -6, 3, -2, 8, -6] #要筛选的原始数据列表 result = ...