转载于:https://blog.csdn.net/qq_22494029/article/details/79273127

简单多线程例子:

detch()启动线程:

 1 #include <iostream>
2 #include <thread>
3 using namespace std;
4 void testThread1();
5 void testThread2();
6 int main()
7 {
8 thread t1(testThread1);
9 t1.detach();
10 thread t2(testThread2);
11 t2.detach();
12 cout<<"主线程:你好帅!!!"<<endl;
13 std::this_thread::sleep_for(std::chrono::milliseconds(10000));
14 return 0;
15 }
16 void testThread1()//线程1
17 {
18 for (int i = 0; i <10 ; ++i) {
19 cout<<"testThread1:"<<i<<endl;
20 //暂停100毫秒
21 std::this_thread::sleep_for(std::chrono::milliseconds(100));
22 }
23 }
24 void testThread2()//线程2
25 {
26 for (int i = 100; i < 110; ++i) {
27 cout<<"testThread2:"<<i<<endl;
28 this_thread::sleep_for(chrono::milliseconds(100));
29 }
30 }

说明:detch()方法的意思就是开启子线程,并且主线程不等待子线程运行完毕,而是和子线程并行运行。

运行结果:

join()方法启动线程:

 1 #include <iostream>
2 #include <thread>
3 using namespace std;
4 void testThread1();
5 void testThread2();
6 int main()
7 {
8 thread t1(testThread1);
9 t1.join();
10 thread t2(testThread2);
11 t2.join();
12 cout<<"主线程:你好帅!!!"<<endl;
13 return 0;
14 }
15 void testThread1()//线程1
16 {
17 for (int i = 0; i <10 ; ++i) {
18 cout<<"testThread1:"<<i<<endl;
19 //暂停100毫秒
20 std::this_thread::sleep_for(std::chrono::milliseconds(100));
21 }
22 }
23 void testThread2()//线程2
24 {
25 for (int i = 100; i < 110; ++i) {
26 cout<<"testThread2:"<<i<<endl;
27 this_thread::sleep_for(chrono::milliseconds(100));
28 }
29 }

说明:join()方法的意思就是开启子线程,线程会按照开启的先后顺序同步运行。

运行结果:

子线程函数带有参数的多线程:

 1 #include <iostream>
2 #include <thread>
3 using namespace std;
4 void testThread1(int count);
5 void testThread2(int start,int count);
6 int main()
7 {
8 thread t1(testThread1,10);
9 t1.join();
10 thread t2(testThread2,40,50);
11 t2.join();
12 cout<<"主线程:你好帅!!!"<<endl;
13 return 0;
14 }
15 void testThread1(int count)
16 {
17 for (int i = 0; i <count; ++i) {
18 cout<<"testThread1:"<<i<<endl;
19 this_thread::sleep_for(chrono::milliseconds(100));
20 }
21 }
22 void testThread2(int start,int count)
23 {
24 for (int i = start; i <count ; ++i) {
25 cout<<"testThread2:"<<i<<endl;
26 this_thread::sleep_for(chrono::milliseconds(100));
27 }
28 }

运行结果:

 多线程安全访问共享数据例子(卖票)

 1 //多线程安全访问共享数据例子(卖票)
2 #include <iostream>
3 #include <thread>
4 #include <mutex>
5 using namespace std;
6 class ThreadTest
7 {
8 private:
9 //票的剩余数目
10 int sum;
11 mutex Mutex;
12 public:
13 //构造函数,构造的时候开启线程
14 ThreadTest()
15 {
16 sum=20;
17 thread t1(&ThreadTest::Thread1,this);
18 t1.detach();
19 thread t2(&ThreadTest::Thread2,this);
20 t2.detach();
21 }
22 //析构函数
23 ~ThreadTest(){}
24
25 //卖票线程1
26 void Thread1()
27 {
28 while(true)
29 {
30
31 this_thread::sleep_for(chrono::milliseconds(100));
32 Mutex.lock();//加锁
33 --sum;
34 if(sum<0)
35 {
36 cout<<"Thread1--票卖完了"<<sum<<endl;
37 break;
38 }
39 cout<<"Thread1--剩余票数:"<<sum<<endl;
40 Mutex.unlock();
41 }
42 Mutex.unlock();
43 }
44 //卖票线程2
45 void Thread2()
46 {
47 while(true)
48 {
49 this_thread::sleep_for(chrono::milliseconds(100));
50 Mutex.lock();//加锁
51 sum--;
52 if(sum<0)
53 {
54 cout<<"Thread2--票卖完了"<<sum<<endl;
55 break;
56 }
57 cout<<"Thread2--剩余票数:"<<sum<<endl;
58 Mutex.unlock();
59 }
60 Mutex.unlock();
61 }
62 };
63 int main()
64 {
65 //多线程卖票类
66 ThreadTest SaleThread;
67 this_thread::sleep_for(chrono::milliseconds(10000));
68 return 0;
69 }

运行结果:

手撕代码之线程:thread类简单使用的更多相关文章

  1. [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)

    简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作.  这就可以使用线程来实现. ...

  2. C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)

    简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作.  这就可以使用线程来实现. ...

  3. 手撕代码:统计1到n二进制数中1出现的总次数

    题目描述: 互娱手撕代码题. 统计从1到n这n个数的二进制表示中1出现的次数. 思路分析: 思路一:直接的做法是从1遍历到n,对于每个数和1做与操作,之后,对于这个数不断做右移操作,不断和1做与操作, ...

  4. 并发基础篇(六):线程Thread类的start()方法和run()方法【转载】

    [转载] 一.初识java的线程是通过java.lang.Thread类来实现的.VM启动时会有一个由主方法所定义的线程.可以通过创建Thread的实例来创建新的线程.每个线程都是通过某个特定Thre ...

  5. 并发基础(六) 线程Thread类的start()和run()

    start()和run()方法对于刚接触线程的人来说,会有点混淆,有点难理解,一般都会有以下疑问: 一.start( )方法 1.为什么需要start方法:它的作用是什么: start方法的作用就是将 ...

  6. C#线程Thread类

    在System.Threading 命名空间下,包含了用于创建和控制线程的Thread 类.对线程的常用操作有:启动线程.终止线程.合并线程和让线程休眠等. 1 启动线程 在使用线程前,首先要创建一个 ...

  7. 线程 Thread类 的四个构造方法简介

    在线程中,Thread类有四个构造方法: 当我们使用 Thread类创建对象的时候,传入参数,就会用到构造方法.ThreadStart 和ParameterizedThreadStart 都是 委托类 ...

  8. 线程 Thread类 GIL锁 信号量 Event事件

    线程的开启方法 进程是操作系统调度的最小单位,一个进程最少有一个主线程,而一个进程中可以开启多个线程 from threading import Thread def task(): print('A ...

  9. 线程Thread类

    进程:资源分配与调动的基本单位.如QQ.迅雷等每个独立运行的程序就是一个进程. 每一个进程可以有多个线程,如QQ可以收发信息.下载上传文件等. 多线程同时工作时,由CPU分配处理. public cl ...

随机推荐

  1. JS 逻辑运算符的特点

    致谢 首先说一下,其他数据类型转换为布尔类型的规则: null.undefined.0.NaN.空字符串转换为false,其他转化为 true. 1. 取反 ! 首先把数据转化为布尔值,然后取反,结果 ...

  2. Smartbi:利用好excel分析工具,数据分析都是小case!

    数据分析听起来好像很高端的样子,但是实际上在一些IT高手的眼里,只需要掌握以下几个excel数据分析小工具的使用,你也能够成为别人眼中的数据大神! 1.excel数据分析工具--条件格式 快速找出符合 ...

  3. Linux查看进程的4种方法

    转至:https://www.cnblogs.com/hml-blog-com/p/11558369.html 进程是在 CPU 及内存中运行的程序代码,而每个进程可以创建一个或多个进程(父子进程). ...

  4. mysql设置定时任务-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年2月26日 前言 mysql中设置定时任务,需要先打开调度才能实现自动执行任务.调度功能开启后过再配合存储过程或事件等组件实现特定或定时的任务实现. 步 ...

  5. MySQL函数及存储过程

    MySQL函数及存储过程 参考文章:https://www.cnblogs.com/wupeiqi/articles/5713323.html 1.函数 1.1内置函数 官方文档:https://de ...

  6. 关于SQL优化的辟谣

    列举一些关于 SQL 语句的谣言,避免一些生瓜蛋子面试的时候被另外一群生瓜蛋子的 SQL 优化宝典给坑了. 以下所有内容都是 SQL Server 中的,其他数据库只能参考和借鉴 一.全表扫描 全表扫 ...

  7. JZ-051-构建乘积数组

    构建乘积数组 题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...A[i-1]A[i+1]...A[n-1]. ...

  8. JZ-026-二叉搜索树与双向链表

    二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 题目链接: 二叉搜索树与双向链表 代码 /** * ...

  9. WPF优秀组件推荐之LiveCharts

    概述 LiveCharts是一个比较漂亮的WPF图表控件,在数据变化时还会有动画切换的效果,并且样式也可以控制. 官方网站:Live Charts (lvcharts.net) 开源代码:GitHub ...

  10. Linux内存泄漏

    0 什么是内存泄漏? 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. 1 常见的造成内 ...