手撕代码之线程: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 ...
随机推荐
- WebGL 与 WebGPU比对[5] - 渲染计算的过程
目录 1. WebGL 1.1. 使用 WebGLProgram 表示一个计算过程 1.2. WebGL 没有通道 API 2. WebGPU 2.1. 使用 Pipeline 组装管线中各个阶段 2 ...
- centos安装k8s集群
准备工作 关闭swap,注释swap分区 swapoff -a 配置内核参数,将桥接的IPv4流量传递到iptables的链 cat > /etc/sysctl.d/k8s.conf < ...
- 【计理01组30号】Java 实现日记写作软件
项目分析 代码设计 com.shiyanlou.entity User.java package com.shiyanlou.entity; public class User { private S ...
- 【C# 线程】转载 句柄的基本概念 .NET对象与Windows句柄
转载自:https://www.cnblogs.com/silverb/p/5300255.html 句柄的基本概念 1.句柄就是进程句柄表中的索引.2.句柄是对进程范围内一个内核对象地址的引用,一个 ...
- 【C# 线程 】内存模型 与Volatile
CPU硬件有它自己的内存模型,不同的编程语言也有它自己的内存模型. 在 C# 的语言规范中 ECMA-334,对于Volatile关键字的描述: 15.5.4 Volatile fieldsWhen ...
- 【C# TAP 异步编程】一 、async 修饰符(标记)
async的作用: 1.async是一个标记,告诉编译器这是一个异步方法. 2.编译器会根据这个标志生成一个异步状态机. 3.编译器将原异步方法中的代码清空,写入状态机的配置,原先异步方法中的代码被封 ...
- URLEncoder和URLDecoder转码
目前看是为了解决网络传输的中文乱码问题 import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import ...
- 修改Ehcache缓存中取到的值,缓存中的值也被修改了
问题现象 我们从Ehcache中取出缓存的对象,之后将对象中的属性进行了修改使用.等再次从缓存中拿到对象后,发现对象的值变成了上一次调用修改后的对象了. 原因 Ehcache中缓存的是原对象的引用,所 ...
- xor加密的python实现
#md5加密 import hashlib hash_md5 = hashlib.md5() x=input("Please input your text:") print( & ...
- CentOS 8: yum仓库配置
在CentOS 8中,使用yum时出现错误,镜像列表中没有url,类似如下: Error: Failed to download metadata for repo 'appstream': Cann ...