手撕代码之线程:thread类简单使用
转载于: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类简单使用的更多相关文章
- [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作. 这就可以使用线程来实现. ...
- C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作. 这就可以使用线程来实现. ...
- 手撕代码:统计1到n二进制数中1出现的总次数
题目描述: 互娱手撕代码题. 统计从1到n这n个数的二进制表示中1出现的次数. 思路分析: 思路一:直接的做法是从1遍历到n,对于每个数和1做与操作,之后,对于这个数不断做右移操作,不断和1做与操作, ...
- 并发基础篇(六):线程Thread类的start()方法和run()方法【转载】
[转载] 一.初识java的线程是通过java.lang.Thread类来实现的.VM启动时会有一个由主方法所定义的线程.可以通过创建Thread的实例来创建新的线程.每个线程都是通过某个特定Thre ...
- 并发基础(六) 线程Thread类的start()和run()
start()和run()方法对于刚接触线程的人来说,会有点混淆,有点难理解,一般都会有以下疑问: 一.start( )方法 1.为什么需要start方法:它的作用是什么: start方法的作用就是将 ...
- C#线程Thread类
在System.Threading 命名空间下,包含了用于创建和控制线程的Thread 类.对线程的常用操作有:启动线程.终止线程.合并线程和让线程休眠等. 1 启动线程 在使用线程前,首先要创建一个 ...
- 线程 Thread类 的四个构造方法简介
在线程中,Thread类有四个构造方法: 当我们使用 Thread类创建对象的时候,传入参数,就会用到构造方法.ThreadStart 和ParameterizedThreadStart 都是 委托类 ...
- 线程 Thread类 GIL锁 信号量 Event事件
线程的开启方法 进程是操作系统调度的最小单位,一个进程最少有一个主线程,而一个进程中可以开启多个线程 from threading import Thread def task(): print('A ...
- 线程Thread类
进程:资源分配与调动的基本单位.如QQ.迅雷等每个独立运行的程序就是一个进程. 每一个进程可以有多个线程,如QQ可以收发信息.下载上传文件等. 多线程同时工作时,由CPU分配处理. public cl ...
随机推荐
- LibOpenCM3(五) 基础功能: 系统时钟, GPIO, 定时器
目录 LibOpenCM3(一) Linux下命令行开发环境配置 LibOpenCM3(二) 项目模板 Makefile分析 LibOpenCM3(三) .ld文件(连接器脚本)和startup代码说 ...
- 一、Java 特性和运行机制
目录 Java 特性和优势 Java应用程序的运行机制 JVM.JRE和JDK Java 特性和优势 跨平台/可移植性 核心优势.比如:Java的int型永远是32位,C++(16,32). 安全性 ...
- 查看jQuery版本号
1. 看源码 2. 用方法 console.log($().jquery) console.log($.fn.jquery)
- RFC2899广播吞吐量测试——网络测试仪实操
一.简介 RFC 2889为LAN交换设备的基准测试提供了方法学,它将RFC 2544中为网络互联设备基准测试所定义的方法学扩展到了交换设备,提供了交换机转发性能(Forwarding Perform ...
- 案例七:shell实现开机自动播放挂载本地yum仓库程序
shell实现开机自动挂载本地YUM仓库自动化程序,可以在没有网络的情况下也可以使用yum安装程序. #!/bin/bash #自动搭建yum本地仓库 # cdrom () { mount /dev/ ...
- RabbitMQ安装以及简单操作应用(针对Windows和C#)
1.RabbitMQ安装 1.1下载并安装Erlang https://www.erlang.org/downloads 一直点next就安装好了.我直接使用了默认的安装目录.否则的话,应该需要配置一 ...
- OJ教程--排序算法
1 算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不 ...
- kNN(k近邻)算法代码实现
目标:预测未知数据(或测试数据)X的分类y 批量kNN算法 1.输入一个待预测的X(一维或多维)给训练数据集,计算出训练集X_train中的每一个样本与其的距离 2.找到前k个距离该数据最近的样本-- ...
- Python迭代器,生成器,装饰器
迭代器 通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值). 可迭代对象(iterable):是指该对象可以被 ...
- Jmeter---压力模式
需求 下面有3个场景,思考一下在jmeter里面如何设计 场景1:有一个项目,500用户同时登录,响应时间能达到多少场景2:考勤打卡,最大吞吐量能达到多少(每秒最大能完成多少笔打卡业务)场景3:银行业 ...