首页 > 编程语言 >C++的多线程编程(练习一下condition_variable)

C++的多线程编程(练习一下condition_variable)

时间:2023-06-10 16:25:56浏览次数:34  
标签:std include record C++ ready mutex variable 多线程 condition

        嗯,高考结束了,那就编写一个阅卷和查成绩的多线程吧。一个线程老师阅卷,其他三个线程查成绩。代码如下:

       

  1 #include <iostream>
  2 #include <thread>
  3 #include <mutex>
  4 #include <condition_variable>
  5 #include <chrono>
  6 #include <future>
  7 #include <map>
  8 
  9 // 定义一个简单的分数存储结构
 10 typedef std::map<std::string, double> RecordType;
 11 
 12 std::mutex ready_mutex;
 13 std::condition_variable ready_condition;
 14 RecordType record_table;
 15 
 16 //模拟成绩查询
 17 void query_score(std::string name)
 18 {
 19     bool need_wait = true;
 20     std::cout << name << ": Now start query score..." << std::endl;
 21     while (need_wait)
 22     {
 23         // 等待条件变量,大括号限制互斥量的作用域,便于自动析构
 24         {
 25             std::unique_lock<std::mutex> unqique_lock_mutex(ready_mutex);
 26             // 设置等待超时30s
 27             std::cv_status status = ready_condition.wait_for(unqique_lock_mutex, std::chrono::seconds(30));
 28             if (std::cv_status::no_timeout == status)
 29             {// 如果还没有超时
 30                 // 开始查询成绩
 31                 auto record = record_table.find(name);
 32                 if (record != record_table.end())
 33                 {//查询到了对应的成绩,就输出
 34                     double score = record_table[name];
 35                     std::cout << name << "'s record is " << score << std::endl;
 36                     need_wait = false;
 37                 }
 38                 else
 39                 {// 查不到成绩,就再次等待
 40                     continue;
 41                 }
 42             }
 43             else
 44             {// 如果等到花儿也谢了
 45                 std::cout << name << "'s record maybe lost!!!" << std::endl;
 46                 need_wait = false;
 47             }
 48         }
 49     }
 50     std::cout << name << ": Now finish query record." << std::endl;
 51 }
 52 
 53 void rate_score()
 54 {
 55     // 老师开始批卷
 56     std::cout << "Now the teacher start rating...." << std::endl;
 57     // 批卷一个同学要5秒,神速
 58     std::this_thread::sleep_for(std::chrono::seconds(5));
 59     // 批改完毕,上传成绩
 60     {
 61         std::lock_guard<std::mutex> lock_guard_the_mutex(ready_mutex);
 62         record_table.insert({ "Lucy", 550.5 });
 63     }
 64     // 上传完毕,需要知会一下正在查询的同学
 65     ready_condition.notify_all();
 66     std::this_thread::yield();
 67 
 68     // 继续批改下一个同学
 69     std::this_thread::sleep_for(std::chrono::seconds(6));
 70     // 再次提示,大括号是为了互斥锁的自动析构
 71     {
 72         std::lock_guard<std::mutex> lock_guard_the_mutex(ready_mutex);
 73         record_table.insert({ "Han Meimei", 655.0 });
 74     }
 75     ready_condition.notify_all();
 76     std::this_thread::yield();
 77 
 78     // 继续批改下一个同学
 79     std::this_thread::sleep_for(std::chrono::seconds(7));
 80     // 可以看出来老师批改越来越慢了
 81     {
 82         std::lock_guard<std::mutex> lock_guard_the_mutex(ready_mutex);
 83         record_table.insert({ "Li Lei", 635.0 });
 84     }
 85     ready_condition.notify_all();
 86     std::this_thread::yield();
 87 
 88     // 老师累了,批完闭眼休息一下,下班了
 89     std::this_thread::sleep_for(std::chrono::seconds(5));
 90     std::cout << "Now the teacher finish rating." << std::endl;
 91 }
 92 
 93 
 94 int main()
 95 {
 96     // 各位同学开始查询成绩
 97     auto thread1 = std::thread(query_score, "Li Lei");
 98     // Han Meimei的手速慢了
 99     std::this_thread::sleep_for(std::chrono::seconds(1));
100     auto thread2 = std::thread(query_score, "Han Meimei");
101     // Lucy在国外,网络延迟了
102     std::this_thread::sleep_for(std::chrono::seconds(3));
103     auto thread3 = std::thread(query_score, "Lucy");
104 
105     // 老师开始批卷
106     auto thread4 = std::thread(rate_score);
107 
108     // 等待成绩查询完毕和批卷完毕
109     thread1.join();
110     thread2.join();
111     thread3.join();
112     thread4.join();
113 
114     return 0;
115 }

 

以下是运行结果:

        知道这三位同学的同学,年纪应该都比较大了。

  

标签:std,include,record,C++,ready,mutex,variable,多线程,condition
From: https://www.cnblogs.com/integrated-circuit-testing/p/17471436.html

相关文章

  • C++基础题
    C++基础题水仙花数#include<iostream>usingnamespacestd;intmain(){cout<<"3位水仙花数:"<<endl;for(intnum=100;num<=999;num++){intdigit1=num/100;//百位数字intdigit2=(num/10)%10;......
  • Python+tkinter+多线程实现文本自动翻页方便阅读
    任务描述:使用Python编写程序,使用tkinter创建界面,使用ScrolledText显示任意文本,然后自动上下翻页方便阅读。参考代码:运行结果:公众号“Python小屋”......
  • c++中static的用法
    1、静态全局变量全局变量的空间会在程序的生命周期内分配,在全局变量的前面加上static,变成静态全局变量。#include<iostream>#include<string.h>usingnamespacestd;staticintn=5;intmain(){n=10;printf("%d\n",n);return0;}静态全局变量......
  • C++面试八股文:指针占用多少个字节?
    C++面试八股文:指针占用多少个字节?某日小二参加XXX科技公司的C++工程师开发岗位4面:面试官:memset、memcpy和strcpy的区别是什么?小二:memset用于将一块内存设置为特定的值,memcpy用于将一块内存从一个位置复制到另一个位置,strcpy用于将一个字符串从一个位置复制到另一个位......
  • 【基础算法】关于高精度计算的问题【很高位数数据的加减乘除(相关代码用C++实现)】
    前言当我们在利用计算机进行一些计算时,可能会遇到这类问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,但因受到硬件的限制,往往达不到实际问题所要求的精度。这时我们就可以通过程序设计来解决这类问题,例如:<fontcolor=red>创建......
  • C++面试八股文:了解sizeof操作符吗?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第10面:面试官:了解sizeof操作符吗?二师兄:略微了解(不就是求大小的嘛。。)面试官:请讲以下如何使用sizeof?二师兄:sizeof主要是求变量或者类型的大小。直接使用sizeof(type)或sizeof(var)即可。面试官:嗯。sizeof(int*)、sizeof(int**)......
  • [Week 20]每日一题(C++,图论,数学,搜索)
    目录T1[Daimayuan]Collision(C++,多源最短路)题目描述输入描述输出描述样例输入1样例输出1样例输入2样例输处2数据范围解题思路T2[Daimayuan]农田划分(C++,数学,BFS)题目描述题目输入题目输出样例输入1样例输出1样例输入2样例输出2数据范围解题思路T3[Daimayuan]三段式(C++,数组前缀......
  • Python使用Queue对象实现多线程同步小案例
    queue模块的Queue对象实现了多生产者/多消费者队列,尤其适合需要在多个线程之间进行信息交换的场合,实现了多线程编程所需要的所有锁语义。Queue对象主要实现了put()和get()方法,分别用来往队列尾部追加元素和在队列头部获取并删除元素。这两个方法都允许指定超时时间,其用法分别为put(......
  • Python使用Condition对象实现多线程同步
    使用Condition对象可以在某些事件触发后才处理数据或执行特定的功能代码,可以用于不同线程之间的通信或通知,以实现更高级别的同步。在内部实现上,Condition对象总是与某种锁对象相关联。Condition对象除了具有acquire()和release()方法之外,还有wait()、wait_for()、notify()、notify_......
  • c++ faq (1-5)
    IS2120.BG57IV3/*#IH//z2013-04-2723:55:54IS2120@BG57IV3.T4259468281.K-----------------------------------++0.ID&Desc:-------------------------------------------------------------------------------+1.读后文摘,每天看点儿,随手记录下。+1.Todo:-----......