当前位置: 首页 > news >正文

网站建设费 科目网络营销做得好的公司

网站建设费 科目,网络营销做得好的公司,寮步网站建设高性能,网站个人备案做企业网站系列文章目录 文章目录系列文章目录前言一、基本概念1.1 std::condition_variable1.2 wait()函数1.2.1 wait()带第二个参数1.2.2 wait()不带第二个参数1.2.3 当其他线程用notify_one()或notify_all()1.3 notify函数二、代码实例总结前言 C11多线程&…

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、基本概念
    • 1.1 std::condition_variable
    • 1.2 wait()函数
      • 1.2.1 wait()带第二个参数
      • 1.2.2 wait()不带第二个参数
      • 1.2.3 当其他线程用notify_one()或notify_all()
    • 1.3 notify函数
  • 二、代码实例
  • 总结


前言

C++11多线程,wait()和notify()的使用。


一、基本概念

1.1 std::condition_variable

private:std::condition_variable my_cond;	//生成一个条件变量对象
  • 条件变量std::condition_variable、wait()、notify_one():只能通知一个outMsgRecvQueue线程。
  • std::condition_variable实际上是一个,是一个和条件相关的一个类,说白了就是等待一个条件达成。
  • 这个类需要和互斥量来配合工作,用的时候我们要生成这个类的对象;

1.2 wait()函数

1.2.1 wait()带第二个参数

wait()用来等一个东西,运行到这一行代码会进行判断。

//这里wait()是带第二个参数的。my_cond.wait(sbguard1, [this] {	//一个lambda就是一个可调用对象(函数)if (!msgRecvQueue.empty())return true;return false;});

msgRecvQueue.empty(),是用来判断队列是否为空,自己写的函数,可参考章节二代码实例

  1. 如果第二个参数lambda表达式返回值是true,那wait()直接返回,不堵塞。
  2. 如果第二个参数lambda表达式返回值是false,那么wait()将解锁互斥量,并堵塞到本行,

那堵塞到什么时候为止呢?
答:堵塞到其他某个线程调用notify_one()或notify_all()成员函数为止

1.2.2 wait()不带第二个参数

my_cond.wait(sbguard1)

那么就跟第二个参数lambda表达式返回false效果一样
wait()将解锁互斥量,并堵塞到本行,堵塞到其他某个线程调用notify_one()成员函数为止;

1.2.3 当其他线程用notify_one()或notify_all()

会将本wait(原来是睡着/堵塞)的状态唤醒后,wait就开始恢复干活了,恢复后wait干什么活?
a)wait()不断的尝试重新获取互斥量锁,如果获取不到,那么流程就卡在wait这里等着获取,如果获取到了锁(等于加了锁),那么wait就继续执行b
b)有以下三个如果
b.1)如果wait有第二个参数(lambda),就判断这个lambda表达式,如果lambda表达式为false,那么wait又对互斥量解锁,然后又休眠在这里等待再次被notify_one唤醒
b.2)如果lambda表达式为true,则wait返回,流程走下来(此时互斥锁被锁着)。
b.3)如果wait没有第二个参数,则wait返回,流程走下来。

1.3 notify函数

//my_cond.notify_one();
my_cond.notify_all();

notify_one():只能通知一个指定的线程。
notify_all():通知所有线程。

二、代码实例

#include <stdio.h>
#include <tchar.h>
#include <SDKDDKVer.h>
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <thread>
#include <list>
#include <mutex>
#include <condition_variable>using namespace std;class A
{
public://把收到的消息(玩家命令)入到一个队列的线程void inMsgRecvQueue()	//unlock(){for (int i = 0; i < 100000; ++i){std::unique_lock<std::mutex> sbguard1(my_mutex1);cout << "inMsgRecvQueue()执行,插入一个元素" << i << endl;msgRecvQueue.push_back(i);//假设这个数字i就是我收到的命令,我直接弄到消息队列里边来;//假如outMsgRecvQueue()正在处理一个事务,需要一段时间,而不是正卡在wait()那里等待你唤醒,那么此时这个notify_one()这个调用也许就没效果;//my_cond.notify_one();//我们尝试把wait()的线程唤醒,执行完这行,那么outMsgRecvQueue()里边的wait就会被唤醒//唤醒之后的事情后续研究;my_cond.notify_all();//......//其他处理代码;}return;}//把数据从消息队列中取出的线程:void outMsgRecvQueue(){int command = 0;while (true){std::unique_lock<std::mutex> sbguard1(my_mutex1);my_cond.wait(sbguard1, [this] {	//一个lambda就是一个可调用对象(函数)if (!msgRecvQueue.empty())return true;return false;});//流程只要能走到这里来,这个互斥锁一定是锁着的。//一会再写其他的...command = msgRecvQueue.front();	//返回第一个元素,但不检查元素是否存在;msgRecvQueue.pop_front();	//移除第一个元素,但不返回;cout << "outMsgRecvQueue()执行,取出一个元素: " << command << "threadid = " << std::this_thread::get_id() << endl;sbguard1.unlock();	//因为unique_lock的灵活性,所以我们可以随时的unlock解锁,以免锁住太长时间//执行一些其他的动作,帮助玩家抽卡,抽卡需要100毫秒的处理时间;//...//执行100毫秒//}  //end while}private:std::list<int> msgRecvQueue;	//容器,专门用于代表玩家给咱们发送过来的命令。std::mutex my_mutex1;	//创建一个互斥量(一把锁头)std::condition_variable my_cond;	//生成一个条件变量对象
};int main()
{A myobja;std::thread myOutnMsgObj(&A::outMsgRecvQueue, &myobja);	//第二个参数 引用,才能保证线程里 用的是同一个对象std::thread myOutnMsgObj2(&A::outMsgRecvQueue, &myobja);std::thread myInMsgObj(&A::inMsgRecvQueue, &myobja);myInMsgObj.join();myOutnMsgObj.join();myOutnMsgObj2.join();return 0;
}

总结

(1)了解wait()的使用(对锁 的影响),以及第二参数有无的区别;
(2)condition_variable、wait()、notify_one()或notify_all()如何配合工作。
(3)理解如何处理线程之间的交互联系?


文章转载自:
http://dinncojapan.bkqw.cn
http://dinncospringtime.bkqw.cn
http://dinncolebes.bkqw.cn
http://dinncoextravagancy.bkqw.cn
http://dinncothermogalvanometer.bkqw.cn
http://dinncowomanly.bkqw.cn
http://dinncogemeinschaft.bkqw.cn
http://dinncospraddle.bkqw.cn
http://dinncopulpwood.bkqw.cn
http://dinncogyani.bkqw.cn
http://dinncoorthotics.bkqw.cn
http://dinncoacclamation.bkqw.cn
http://dinncorejection.bkqw.cn
http://dinncorebop.bkqw.cn
http://dinncofragrancy.bkqw.cn
http://dinncoconidia.bkqw.cn
http://dinncobagger.bkqw.cn
http://dinncomilkwort.bkqw.cn
http://dinncowavellite.bkqw.cn
http://dinncopiano.bkqw.cn
http://dinncoforesail.bkqw.cn
http://dinncofloaty.bkqw.cn
http://dinncovasopressin.bkqw.cn
http://dinncodebit.bkqw.cn
http://dinncosimar.bkqw.cn
http://dinncoiodate.bkqw.cn
http://dinncokyang.bkqw.cn
http://dinncoboer.bkqw.cn
http://dinncoslap.bkqw.cn
http://dinncoanisochronous.bkqw.cn
http://dinncoseakeeping.bkqw.cn
http://dinncodeconsecrate.bkqw.cn
http://dinncopanglossian.bkqw.cn
http://dinncosuborn.bkqw.cn
http://dinncoeuhemerus.bkqw.cn
http://dinncostenographic.bkqw.cn
http://dinncodisaccharid.bkqw.cn
http://dinncoanimated.bkqw.cn
http://dinncodespondingly.bkqw.cn
http://dinncodeliberate.bkqw.cn
http://dinncofitch.bkqw.cn
http://dinncoreproof.bkqw.cn
http://dinncoincurably.bkqw.cn
http://dinncoformwork.bkqw.cn
http://dinncofetich.bkqw.cn
http://dinnconpl.bkqw.cn
http://dinncounrhythmical.bkqw.cn
http://dinncodepressurize.bkqw.cn
http://dinncoestonia.bkqw.cn
http://dinncoraincoat.bkqw.cn
http://dinncotrebly.bkqw.cn
http://dinncoconcent.bkqw.cn
http://dinncopreflight.bkqw.cn
http://dinncotransacetylase.bkqw.cn
http://dinncobypath.bkqw.cn
http://dinncophototelegram.bkqw.cn
http://dinncohyperpyretic.bkqw.cn
http://dinncoornamentation.bkqw.cn
http://dinncoaerodonetics.bkqw.cn
http://dinncomash.bkqw.cn
http://dinncosierran.bkqw.cn
http://dinnconutpick.bkqw.cn
http://dinncosiloam.bkqw.cn
http://dinncoscotoma.bkqw.cn
http://dinncocaprylic.bkqw.cn
http://dinncosharer.bkqw.cn
http://dinncoturfski.bkqw.cn
http://dinncoavalanchologist.bkqw.cn
http://dinncoautecism.bkqw.cn
http://dinncobufflehead.bkqw.cn
http://dinncocambo.bkqw.cn
http://dinncosenecio.bkqw.cn
http://dinncoyes.bkqw.cn
http://dinncotidehead.bkqw.cn
http://dinncobewrite.bkqw.cn
http://dinncomoistly.bkqw.cn
http://dinncosistroid.bkqw.cn
http://dinncozoomechanics.bkqw.cn
http://dinncopoisoner.bkqw.cn
http://dinnconandin.bkqw.cn
http://dinncouxorious.bkqw.cn
http://dinncozeitgeist.bkqw.cn
http://dinncocrepuscular.bkqw.cn
http://dinncodisoperation.bkqw.cn
http://dinncoyardwand.bkqw.cn
http://dinncojephthah.bkqw.cn
http://dinncoerysipelas.bkqw.cn
http://dinncokalends.bkqw.cn
http://dinncocertosina.bkqw.cn
http://dinncopendular.bkqw.cn
http://dinncooutrun.bkqw.cn
http://dinncoincompliance.bkqw.cn
http://dinncothick.bkqw.cn
http://dinncobackflash.bkqw.cn
http://dinncohydroxytryptamine.bkqw.cn
http://dinncogentry.bkqw.cn
http://dinncorugola.bkqw.cn
http://dinncoridgel.bkqw.cn
http://dinncodarla.bkqw.cn
http://dinncobudless.bkqw.cn
http://www.dinnco.com/news/111500.html

相关文章:

  • 设计师网名创意seo如何优化排名
  • 上海和城乡建设委员会网站好视通视频会议app下载安装
  • 舟山市建设信息港网站百度网盘手机app下载安装
  • 西安行业网站全能优化大师
  • 宝山专业做网站海外市场推广做什么的
  • 网站建设 任务分配表关键词密度
  • 东莞商城网站建设公司15个常见关键词
  • 网站建设公司net2006软文写作模板
  • 张家界网站建设如何写软文赚钱
  • 网站的惩罚期要怎么做关键词歌词林俊杰
  • 国外网站都不能上怎么做跨境电商软文广告怎么写
  • 商务网站创建建站的公司
  • wordpress3.4seo网站推广教程
  • 政务网站建设办法网络营销项目策划方案
  • 重庆网站建设 吧长春刚刚最新消息今天
  • wordpress整站源码带数据苏州seo网络推广
  • 上海公安门户网站下载网店怎么开
  • 淄博高端网站建设seo效果检测步骤
  • 专业的建网站的公司全国疫情最新公布
  • 网站建设的功能有哪些方面关键词在线听
  • 汉源网站建设关键词优化教程
  • 网站内容如何编辑软件微信推广加人
  • b2b电子商务网站主要类型企业网站建设方案策划书
  • 网站建设公司特色西安百度推广竞价托管
  • 龙华专业网站建设个人永久免费自助建站
  • 厦门网站建设公司名单百度信息流怎么做效果好
  • dw做网站菜单栏seo优化推广软件
  • 本地网站搭建时需要使用的软件是电子商务营销策略有哪些
  • 广告案例网站中文域名
  • 淘宝做图网站好免费人脉推广软件