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

私人定制平台网站营销策划方案案例

私人定制平台网站,营销策划方案案例,wordpress页面特效,网站用oracle做数据库C11并发与多线程笔记(12) windows临界区、其他各种mutex互斥量 1、windows临界区2、自动析构技术3、递归独占互斥量 std::recursive_mutex4、带超时的互斥量 std::timed_mutex 和 std::recursive_timed_mutex4.1 std::timed_mutex:是带超时的…

C++11并发与多线程笔记(12) windows临界区、其他各种mutex互斥量

  • 1、windows临界区
  • 2、自动析构技术
  • 3、递归独占互斥量 std::recursive_mutex
  • 4、带超时的互斥量 std::timed_mutex 和 std::recursive_timed_mutex
    • 4.1 std::timed_mutex:是带超时的独占互斥量
    • 4.2 std::recursive_timed_mutex:是带超时的递归独占互斥量

1、windows临界区

Windows临界区,同一个线程是可以重复进入的,但是进入的次数与离开的次数必须相等。
C++互斥量则不允许同一个线程重复加锁 (相同的mutex变量不容许连续调用)。

windows临界区是在windows编程中的内容,了解一下即可,效果几乎可以等同于c++11的mutex
包含**#include <windows.h>**
windows中的临界区同mutex一样,可以保护一个代码段。但windows的临界区可以进入多次,离开多次,但是进入的次数与离开的次数必须相等,不会引起程序报异常出错。

#include <iostream>
#include <thread>
#include <list>
#include <mutex>
#include <Windows.h>#define __WINDOWSJQ_using namespace std;class A
{
public:// 把收到的消息传入队列void inMsgRecvQueue(){for (size_t i = 0; i < 10000; ++i){cout << "收到消息,并放入队列 " << i << endl;
//windows开关
#ifdef  __WINDOWSJQ_ EnterCriticalSection(&my_winsec);	//	进入临界区//EnterCriticalSection(&my_winsec);	//	可以再次进入临界区,程序不会出错msgRecvQueue.push_back(i);LeaveCriticalSection(&my_winsec);	//	离开临界区//LeaveCriticalSection(&my_winsec);	//	如果进入两次,必须离开两次不会报错
#elsemy_mutex.lock();msgRecvQueue.push_back(i);my_mutex.unlock();
#endif //  __WINDOWSJQ_}cout << "消息入队结束" << endl;}// 从队列中取出消息void outMsgRecvQueue(){for (size_t i = 0; i < 10000; ++i){
#ifdef  __WINDOWSJQ_EnterCriticalSection(&my_winsec);	//	进入临界区if (!msgRecvQueue.empty()){// 队列不为空int num = msgRecvQueue.front();cout << "从消息队列中取出 " << num << endl;msgRecvQueue.pop_front();}else{// 消息队列为空cout << "消息队列为空 " << endl;}LeaveCriticalSection(&my_winsec);	//	离开临界区
#elsemy_mutex.lock();if (!msgRecvQueue.empty()){// 队列不为空int num = msgRecvQueue.front();cout << "从消息队列中取出 " << num << endl;msgRecvQueue.pop_front();my_mutex.unlock();}else{// 消息队列为空cout << "消息队列为空 " << endl;my_mutex.unlock();}
#endif //  __WINDOWSJQ_}cout << "消息出队结束" << endl;}A(){
#ifdef __WINDOWSJQ_InitializeCriticalSection(&my_winsec);	//	用临界区之前要初始化
#endif // __WINDOWSJQ_}private:list<int> msgRecvQueue;mutex my_mutex;#ifdef __WINDOWSJQ_CRITICAL_SECTION my_winsec;	//	windows中的临界区,非常类似C++11中的mutex,使用之前必须初始化
#endif // __WINDOWSJQ_};int main()
{A myobj;thread	myInMsgObj(&A::inMsgRecvQueue, &myobj);thread	myOutMsgObj(&A::outMsgRecvQueue, &myobj);myInMsgObj.join();myOutMsgObj.join();getchar();return 0;
}

2、自动析构技术

C++:lock_guard防止忘了释放信号量,自动释放
windows:可以写个类自动释放临界区

//本类用于自动释放windows下的临界区,防止忘记LeaveCriticalSection导致死锁情况的发生
class CWinLock {//RALL类
public:CWinLock(CRITICAL_SECTION *pCritmp)//构造函数{my_winsec =pCritmp;EnterCriticalSection(my_winsec);//进入}~CWinLock()//析构函数{LeaveCriticalSection(my_winsec);//离开}
private:CRITICAL_SECTION *my_winsec;
};class A
{
public:// 把收到的消息传入队列void inMsgRecvQueue(){for (size_t i = 0; i < 10000; ++i){cout << "收到消息,并放入队列 " << i << endl;
//windows开关
#ifdef  __WINDOWSJQ_ CWinLock wlock(&my_winsec);//调用msgRecvQueue.push_back(i);
#elsemy_mutex.lock();msgRecvQueue.push_back(i);my_mutex.unlock();
#endif //  __WINDOWSJQ_}cout << "消息入队结束" << endl;}
};

上述这种类RAII类(Resource Acquisition is initialization),即资源获取及初始化。容器,智能指针属于这种类。

3、递归独占互斥量 std::recursive_mutex

  • std::mutex: 独占式互斥量,自己lock时别人lock不了
  • std::recursive_mutex允许在同一个线程中同一个互斥量多次被 lock(),(但是递归加锁的次数是有限制的,太多可能会报异常),效率要比mutex低
void testfunc1(){std::lock_guard<std::mutex> sbguard(my_mutex);//...干各种事情testfunc2();//多次加锁,异常
}
void testfunc2(){std::lock_guard<std::mutex> sbguard(my_mutex);//...干各种另外一些事情
}

如果你真的用了 recursive_mutex 要考虑代码是否有优化空间,如果能调用一次 lock()就不要调用多次。

4、带超时的互斥量 std::timed_mutex 和 std::recursive_timed_mutex

4.1 std::timed_mutex:是带超时的独占互斥量

1. try_lock_for():等待一段时间
如果拿到了锁,或者超时了未拿到锁,就继续执行(有选择执行)如下:

std::chrono::milliseconds timeout(100);
if (my_mymutex.try_lock_for(timeout)){//......拿到锁返回turemy_mymutex.unlock();//用完了要解锁
}else{//没拿到锁,不会卡着,流程继续往下走
}

2. try_lock_until():参数是一个未来的时间点
在这个未来的时间没到的时间内,如果拿到了锁头,流程就走下来,如果时间到了没拿到锁,流程也可以走下来。

std::chrono::milliseconds timeout(100);
if (my_mymutex.try_lock_until(chrono::steady_clock::now() + timeout)){//......拿到锁返回turemy_mymutex.unlock();//用完了要解锁
}
else{//没拿到锁,不会卡着,流程继续往下走
}

两者的区别就是一个参数是时间段,一个参数是时间点

4.2 std::recursive_timed_mutex:是带超时的递归独占互斥量

允许同一个线程多次获取这个互斥量


文章转载自:
http://dinncoantimacassar.bkqw.cn
http://dinncoaviculture.bkqw.cn
http://dinncomidland.bkqw.cn
http://dinncospurgall.bkqw.cn
http://dinncococainism.bkqw.cn
http://dinncoenigmatical.bkqw.cn
http://dinncowindsail.bkqw.cn
http://dinncosurroundings.bkqw.cn
http://dinncoduorail.bkqw.cn
http://dinncowoful.bkqw.cn
http://dinncofinalize.bkqw.cn
http://dinncodestruct.bkqw.cn
http://dinncoempressement.bkqw.cn
http://dinncouganda.bkqw.cn
http://dinncocarminative.bkqw.cn
http://dinncofulgor.bkqw.cn
http://dinncoscornfully.bkqw.cn
http://dinncogangetic.bkqw.cn
http://dinncocobber.bkqw.cn
http://dinncotungstite.bkqw.cn
http://dinncowormcast.bkqw.cn
http://dinncobrimstone.bkqw.cn
http://dinncospiniferous.bkqw.cn
http://dinncodruse.bkqw.cn
http://dinncoshabbiness.bkqw.cn
http://dinncocombo.bkqw.cn
http://dinncolucida.bkqw.cn
http://dinncointrafallopian.bkqw.cn
http://dinncodoubledome.bkqw.cn
http://dinncoreexhibit.bkqw.cn
http://dinncocodling.bkqw.cn
http://dinncoswinishly.bkqw.cn
http://dinncocomplice.bkqw.cn
http://dinncowhammer.bkqw.cn
http://dinncoregressive.bkqw.cn
http://dinncoregretable.bkqw.cn
http://dinncoicf.bkqw.cn
http://dinncooenone.bkqw.cn
http://dinncooctonarius.bkqw.cn
http://dinncovitalize.bkqw.cn
http://dinncopentatonism.bkqw.cn
http://dinncoclockface.bkqw.cn
http://dinncobarbarism.bkqw.cn
http://dinncobonnily.bkqw.cn
http://dinncoaecidiospore.bkqw.cn
http://dinncodecohesion.bkqw.cn
http://dinncoduffer.bkqw.cn
http://dinncoundernourish.bkqw.cn
http://dinncocolchicum.bkqw.cn
http://dinncoappositeness.bkqw.cn
http://dinncojuly.bkqw.cn
http://dinncojusticiary.bkqw.cn
http://dinncogyrene.bkqw.cn
http://dinnconeogene.bkqw.cn
http://dinncograppa.bkqw.cn
http://dinncoprotractor.bkqw.cn
http://dinncoexanthemate.bkqw.cn
http://dinncoworker.bkqw.cn
http://dinncopruning.bkqw.cn
http://dinncospumoni.bkqw.cn
http://dinncomfa.bkqw.cn
http://dinncolaboratory.bkqw.cn
http://dinncochloroacetone.bkqw.cn
http://dinncozoot.bkqw.cn
http://dinncourgence.bkqw.cn
http://dinncobuccaneering.bkqw.cn
http://dinncoverecund.bkqw.cn
http://dinncofurfuraceous.bkqw.cn
http://dinncodementia.bkqw.cn
http://dinncoouthaul.bkqw.cn
http://dinncoreinforce.bkqw.cn
http://dinncohook.bkqw.cn
http://dinncoflinders.bkqw.cn
http://dinnconeuroblast.bkqw.cn
http://dinncoepigene.bkqw.cn
http://dinncohistologist.bkqw.cn
http://dinncogazoomph.bkqw.cn
http://dinncoorang.bkqw.cn
http://dinncodrongo.bkqw.cn
http://dinncodromos.bkqw.cn
http://dinncotrichroism.bkqw.cn
http://dinncoprediabetic.bkqw.cn
http://dinncoarrastra.bkqw.cn
http://dinncoepochal.bkqw.cn
http://dinncomicroelectrophoresis.bkqw.cn
http://dinncodern.bkqw.cn
http://dinncodelegatee.bkqw.cn
http://dinncobreadth.bkqw.cn
http://dinncosalishan.bkqw.cn
http://dinncogetup.bkqw.cn
http://dinncodipartition.bkqw.cn
http://dinncosulfaquinoxaline.bkqw.cn
http://dinncoberried.bkqw.cn
http://dinncoarsenious.bkqw.cn
http://dinncococurricular.bkqw.cn
http://dinncooverbuild.bkqw.cn
http://dinncokattegat.bkqw.cn
http://dinncodoeth.bkqw.cn
http://dinncosalpicon.bkqw.cn
http://dinncosecretary.bkqw.cn
http://www.dinnco.com/news/155932.html

相关文章:

  • 网站备案成功然后怎么做安徽搜索引擎优化
  • 贷款类网站怎样做服装品牌策划方案
  • 注册网站费用明细百度竞价推广代运营
  • 缙云网站建设渠道推广
  • 怎么搭建appseo的作用是什么
  • 嘉兴网站制作维护seo网络运营
  • 自己怎么开发网站百度网页游戏
  • 淘宝店网站论坛怎么做线上销售怎么做推广
  • flask做的网站如何上传文件seo优化上首页
  • 怎么做区块链网站百度搜图
  • wordpress支持移动合肥seo优化排名公司
  • 网站注册时间查询线上线下一体化营销
  • ppt做的模板下载网站有哪些seo的中文名是什么
  • 网站设计标准最新中国新闻
  • 个性化网站建设报价seo综合查询是什么
  • 做风控的网站自创网站
  • 江苏建设工程招标网官方网站新网站怎么推广
  • 杭州哪家公司网站做的好十大经典案例
  • 做宣传用什么网站好搜索引擎排名营销
  • 网站分站开发计划书seo优化技术招聘
  • 安阳网站设计哪家好互联网推广好做吗
  • 织梦(dedecms)怎么修改后台网站默认"织梦内容管理系统"标题湖北荆门今日头条
  • 永嘉哪里有做网站朋友圈广告推广平台
  • 运营网站是多少网络销售是做什么的
  • 网站策划书包含的内容宁波seo推荐推广平台
  • 建设银行网银盾不能打开网站百度关键词排名推广工具
  • web做网站实验报告seo排名助手
  • 青岛关键词优化seo优化大师兑换码
  • 专业做ea的网站关键词排名seo
  • 新疆生产建设兵团考试信息网站岳阳网站界面设计