转载于: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. 巧用 CSS 把图片马赛克化

    一.image-rendering 介绍 CSS 中有一个有趣的特性叫 image-rendering,它可以通过算法来更好地显示被缩放的图片. 假设我们有一张尺寸较小的二维码截图(下方左),将其放大 ...

  2. Linux系列——挂载Windows虚拟文件夹到Linux系统

    ​ 在windows操作系统上安装多台Linux虚拟机,需要方便的在windows系统和虚拟机上的Linux系统进行文件拷贝. 需要用到共享虚拟文件夹技术,将windows文件夹挂载到linux系统中 ...

  3. 解构函数(Deconstruct)

    元组的解构是C#内置支持的. var countrInfo = ("Malawi", "Lilongwe", io); (string name, string ...

  4. WeifenLuo.WinFormsUI.Docking 简单入门

      WinForm布局,开源且好用的貌似不多,WeifenLuo.WinFormsUI.Docking 这个是其中之一,这个唯一的不好地方,就是没有文档,只能通过读源码,不过它源码里面也提供了一个例子 ...

  5. 多个n维向量围成的n维体积的大小

    前言 上周我们数学老师给了我们一道题,大意就是两个向量a和b,一个点M=$x*a+y*b$,x,y有范围,然后所有M组成的面积是一个定值,求x+y的最小值.当然这是道小水题,但我在想,如果把两个向量变 ...

  6. Java课程设计---数据库工具类

    接下来看看传统的查询方式(一个完整的查询) package com.java.mysql; import java.sql.Connection; import java.sql.DriverMana ...

  7. LeetCode-007-整数反转

    整数反转 题目描述:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果. 如果反转后整数超过 32 位的有符号整数的范围 [\(−2^{31}\), \(2^{31}\) − ...

  8. 扩展我们的分析处理服务(Smartly.io):使用 Citus 对 PostgreSQL 数据库进行分片

    原文:Scaling Our Analytical Processing Service: Sharding a PostgreSQL Database with Citus 在线广告商正在根据绩效数 ...

  9. 矩池云上使用nohup和&让任务后台运行

    1.nohup 用途:不挂断地运行命令. 语法:nohup Command [ Arg - ] [ & ] 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup ...

  10. Kibana-CentOS7单机安装测试

    一.是什么 Kibana 是为 Elasticsearch设计的开源分析和可视化平台.你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互.你可以很容易实现 ...