手撕代码之线程: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 ...
随机推荐
- 关于 Xcode 更新 appleID 更换
可能不少人会遇到 前一位同事走之后,他的 appID帐号下载的东西更新不了 下面给予大家一个解决办法 例如 Xcode 1.打开引用程序目录 2.找到Xcode,右键"显示包内容&quo ...
- maven私有仓库从搭建到使用
因工作需要,需要搭建公司自己的私有仓库,存储自己的私有jar包,所以研究了下 一.环境准备 1.下载并安装nexus,然后启动项目,这部分攻略网上很多,而且基本上都是正确的,此处不做梳理 2.登录12 ...
- Lesson1——Tensor
Tensor Method 描述 is_tensor(obj) 如果 obj 是 PyTorch 张量,则返回 True : is_storage(obj) 如果 obj 是 PyTorch 存储对象 ...
- kali各工具使用介绍
各工具kali官方简介(竖排):https://tools.kali.org/tools-listing 安装kali虚拟机可参考:https://www.cnblogs.com/lsdb/p/650 ...
- bugku-Web md5 collision writeup
访问题目链接,得到提示input a,而题目是md5 collision,md5碰撞.所以找一个md5是oe开头的值,get方式传参过去,PAYLOAD http://114.67.246.176:1 ...
- Meterpreter核心命令
实验目的 掌握Meterpreter常见的基本命令的使用 实验原理 1.Meterpreter介绍 meterpreter是metasploit框架中的一个扩展模块,作为溢出成功以后的攻击载荷使用,攻 ...
- DHCPv4协议测试——信而泰网络测试仪实操
一.DHCP简介 1. DHCP原理 DHCPv4概述 上网最基本元素 · IP地址 · 子网掩码 · 缺省网关 · DNS服务器 DHCP概述-手工配置 为什么需要自动分配,手工配置不行吗? · 答 ...
- 图表制作软件哪家强?当属火爆商业智能圈的Smartbi
图表制作软件选择多吗? 相对来说,统计图表制作软件还是很多的.比如常见的百度图说还有wps和excel都是可以制作好看的统计图的.关键就是看是在怎样的业务场景下使用.一般情况下,如果你对Excel足够 ...
- Oracle数据库常用命令整理
转至:https://blog.csdn.net/creativemobile/article/details/8982164 1监听 (1)启动监听 lsnrctl start (2)停止监听 l ...
- ASP.NET Core 6框架揭秘实例演示[16]:内存缓存与分布式缓存的使用
.NET提供了两个独立的缓存框架,一个是针对本地内存的缓存,另一个是针对分布式存储的缓存.前者可以在不经过序列化的情况下直接将对象存储在应用程序进程的内存中,后者则需要将对象序列化成字节数组并存储到一 ...