// C++_THREAD.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <thread>
#include <windows.h>
using namespace std;
#define DEBUG
#ifdef DEBUG
void print()
{Sleep(5000);cout << "子线程运行。。。" << endl;}
void print2()
{cout << "子线程2.。运行" << endl;Sleep(5000);}
#endif // DEBUG//使用detch将分离
//判断当初是否detach:jionable()判断当前线程是否可以jion或detach,可以返回true
/*创建线程的方法:1.通过普通函数2.通过类和对象3.lambda表达式4.带参的方式5.智能指针6.类的成员函数
*/
int main1()
{//如果创建一个线程不做处理会调用abort函数终止程序thread test1(print);thread test2(print2);test1.detach();//这样的话主线程直接结束,不能在终端显示if (test1.joinable()){test1.detach();}//test1.join();//阻塞,等待子线程结束,才会进行主进程test2.detach();//test2.join();std::cout << "Hello World!\n";return 1;
}
--------------------------------------------------------------------------------------------------------------
class MM
{
public:MM();~MM();void operator()(){cout << "子线程启动..." << endl;}private:};MM::MM()
{
}MM::~MM()
{
}
int main2()
{MM mm;thread test1(mm);test1.join();thread test2((MM()));test2.join();return 0;
}
--------------------------------------------------------------------------------------------------------------
//通过lambda表达式创建线程
/*
int max(int a, int b)
{return a > b ? a : b;
}
*/
int main3()
{int (*pmax)(int, int) = nullptr;pmax = [](int a, int b)->int {return a > b ? a : b; };cout << pmax(1, 2) << endl;thread test1([] {cout << "子线程运行.,." << endl; });test1.join();cout << "主线程运行" << endl;return 9;
}
--------------------------------------------------------------------------------------------------------------
//带参数的线程创建
void printInfo(int& num)
{cout << "子线程\t" << num << endl;
}
int main4()
{//std::ref用于包装传递引用的值int num = 5;thread test1(printInfo, std::ref(num));test1.join();cout << "主线程...." << endl;return 0;
}
//智能指针充当线程处理函数
--------------------------------------------------------------------------------------------------------------
void print22(unique_ptr<int> ptr)
{cout << "子线程.." << ptr.get() << endl;cout << this_thread::get_id() << endl;
}int main5()
{cout << this_thread::get_id() << endl;//get方法打印指针的指向地址unique_ptr<int> ptr(new int(1000));cout << "主线程:" << ptr.get() << endl;thread test1(print22,move(ptr));test1.join();cout << "主线程..." << ptr.get()<< endl;return 0;
}
--------------------------------------------------------------------------------------------------------------
//以类的成员函数充当线程处理函数class MyClass
{
public:MyClass();~MyClass();void print(int& num){num = 1001;cout << "子线程" << this_thread::get_id() << endl;}
private:};MyClass::MyClass()
{
}MyClass::~MyClass()
{
}
int main6()
{MyClass ii;int num = 1007;//以类的成员函数为参数的话,需要告知thread是那个对象的thread test(&MyClass::print, ii, ref(num));test.join();cout << "主线程" << this_thread::get_id() << endl;return 0;
}
--------------------------------------------------------------------------------------------------------------
//引申多线程的数据共享
#include <list>class Seeking
{
public:Seeking();~Seeking();void makeFriend(){for (int i =0;i<1000;i++){cout << "系的一枚女朋友" <<i<< endl;mm.push_back(i);}}void breakUp(){for (int i =0;i<1000;i++){if (!mm.empty()){cout << "失去一枚女票:" <<mm.front()<<  endl;mm.pop_front();}else{cout << "都分手了" << endl;}}}
protected:list<int> mm;
private:};Seeking::Seeking()
{
}Seeking::~Seeking()
{
}
int main()
{Seeking dd;thread test1(&Seeking::makeFriend, &dd);thread test2(&Seeking::breakUp, &dd);test1.join();test2.join();return 0;
}

c++创建线程的6种方法相关推荐

  1. 【 Thread】创建线程的2种方法

    (一)Thread类 1.结构 java.lang.Object |---java.lang.Thread 2.创建线程的两种方法 (1)一种方法是将类声明为Thread的子类,该子类应重写Threa ...

  2. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

  3. Java创建线程的三种方法

    这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析. 通过三种方法可以创建java线程: 1.继承Thread类. 2.实现Runnable接口. 3.实现Callab ...

  4. Java 创建线程的三种方法比较

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java 创建线程的三种方法比较, 更多Java专业知识,广州疯狂jav ...

  5. 创建线程的七种方法 (图解 全网最全最详细)

    本文创建于 2021年5月14日 作者:Xiang 参考文献:创建多线程的四种方法 创建线程的8种方法 创建匿名线程的5种方法 特别鸣谢 文章目录 1.什么是多线程 2.线程状态 3.线程同步方法 4 ...

  6. java创建线程的两种方法区别

    在Java中创建一个线程有两种方法:继承Thread类和实现Runnable接口. 下面通过两个例子来分析两者的区别: 1)继承Thread类 public class TestThread exte ...

  7. 为什么不能线程调用类的成员函数_C++多线程编程之创建线程的几种方法

    点蓝色字关注"CurryCoder的程序人生" 微信公众号:CurryCoder的程序人生 怕什么真理无穷,进一寸有一寸的欢喜 1.线程基础知识 可执行程序运行起来,就会生成一个进 ...

  8. java创建线程的四种方法

    第一种:  通过继承Thread类创建线程 第二种: 通过实现Runnable接口创建线程 这两种早已烂记于心,这里就不作过多的介绍, 主要介绍其源码 Thread类 implements Runna ...

  9. 线程 --- 创建线程的七种方法

    目录 方法1 :继承Thread类,重写run方法,调用 start 方法启动 方法2 :实现Runnable接口,重写run方法,调用 start 方法启动 方法3:匿名内部类 创建Thread 子 ...

  10. java 创建线程的三种方法_java 创建线程的几种方式

    说道线程,肯定会想到使用 java.lang.Thread.java这个类 那么创建线程也主要有2种方式 第一种方式: public class MyThread extends Thread { p ...

最新文章

  1. RabbitMQ学习总结(5)——发布和订阅实例详解
  2. 剑指offer 面试3题
  3. 解决pycharm输入法不跟随的方法
  4. 本地方法中printf如何传给java--java系统级命名管道
  5. 零件分组pascal程序
  6. 等了这么久,就给我看这个?
  7. Spring容器初始化实现V2 版本
  8. android touch事件坐标原点,Android onTouch事件与手势操作
  9. iostream类 - C++输入输出(一)
  10. 城市公交类毕业论文文献都有哪些?
  11. 7月的尾巴,你是XXX
  12. Codeforces - Inna and Dima
  13. 重要的Linux系统文件介绍
  14. Excel多条件计数——COUNTIFS【获奖情况统计】
  15. ARFoundation系列讲解 - 57 3D物体识别一
  16. 7-158 判断4和7的倍数
  17. OLTP和OLAP的区别;
  18. 配置Caddy2的Caddyfile(自有https证书和CloudflareDNS和源服务器证书)以及caddy.service的开机启动
  19. distcc 链接失败_distcc (dcc_execvp) ERROR: failed to exec XX: Permission denied
  20. 计量经济学笔记2-Eviews操作

热门文章

  1. 数字化营销服务-如何进行数字化营销?
  2. 十大气势背景音乐(适合战队,广告招商会场用)
  3. 使用 stm32实现锂电充电_12V锂电池保护板电路图锂电池保护板工作原理及短路、过充电等控制原理分析...
  4. QTTabBar+Office Tab+Quicker 助力高效使用Windows办公
  5. Oracle体系结构图(思维导图及详解)
  6. 2022年最新前端面试题(大前端时代来临卷起来吧小伙子们..持续维护走到哪记到哪)
  7. 《计算机网络(第七版)谢希仁 编著》部分课后答案
  8. photoshop实现图片更换背景
  9. android选择本地相册或拍照更换软件背景图片
  10. k8s系列03-kubeadm部署calico网络的k8s集群