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

广州网站优化公司如何互联网广告营销方案

广州网站优化公司如何,互联网广告营销方案,重庆病毒感染最新消息,建筑工程承包方式目录 互斥 为什么需要锁 锁的原理--互斥 锁的使用 同步 锁的问题 条件变量 互斥 为什么需要锁 先看结果&#xff1a; 以下代码是我模拟创建线程抢票&#xff0c;由于不加锁导致票抢到了负数 main.cc: #include<vector> #include<iostream> #include"…

目录

互斥

为什么需要锁

锁的原理--互斥

锁的使用

同步

锁的问题

条件变量


互斥

为什么需要锁

先看结果:

以下代码是我模拟创建线程抢票,由于不加锁导致票抢到了负数

main.cc:

#include<vector>
#include<iostream>
#include"Thread.hpp"
#include <unistd.h>int tickets = 10000;void Ticket()
{while (true){if(tickets > 0){usleep(1000);printf("tickets: %d\n",tickets--);}elsereturn ;}
}int main()
{std::vector<xjh::Thread> arr;for(int i = 0; i < 4; i++){arr.emplace_back(Ticket);}for(int i = 0; i < 4; i++){arr[i].Start();}for(int i = 0; i < 4; i++){arr[i].Join();}return 0;
}

由于我封装了pthread,奉上

Thread.hpp

#include<pthread.h>
#include<functional>namespace xjh
{using pfunc = std::function<void()>;static int i = 0;class Thread{static void* Handle(void* args){Thread* td = static_cast<Thread*>(args);td->_func();return nullptr;}public:Thread(pfunc func):_func(func){i++;}void Start(){pthread_create(&_pid,nullptr,Handle,this);}void Join(){pthread_join(_pid,nullptr);}~Thread(){}private:pfunc _func;pthread_t  _pid;};
}

造成以上结果的原因就是在

1、if()操作不是原子操作

2、线程的调度切换

原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成

简单想象一下,比如张三在询问完是否还有余票的时候,有,就进去拿了,如果此时只有一张票了,这个时候李四来了,张三还没有出来,李四说还有一张票,也进去了。这个时候就出错了。

锁的原理--互斥

数据被多次拿到的对策就是一次只允许一个人可以使用这一份资源。

比如单人自习室门口挂了一个令牌,在进入自习室的时候必须带上令牌,并且只有一个人可以进入自习室,这个时候。我们规定好在这个人交出令牌之前其他人不得入内。这个时候这个令牌就是锁了。

那么底层的原理就是有一个东西类似与这个令牌。但是我又怎么保障拿到这个令牌的时候别人不来抢呢?这时候我们就要保证拿令牌这个操作是原子操作了。

如上,在操作系统内部,有swap和exchange来保证原子性,当一个拿到了内存里面mutex的锁的被放到了自己的寄存器里,别人就拿不到只能阻塞等待了

锁的使用

  1. 锁的本质就是对资源的保护。需要保护的资源是临界资源。
  2. 因为拿不到锁的线程会阻塞,所以不能大块的代码加锁,要保证细粒度
  3. 加锁就是找到临界区,对临界区加锁

同步

依旧讲故事理解:

锁的问题

在单人自习室的时候,比如张三在拿到令牌了之后,从早上7点学到了中午12点,张三准备去吃饭了,但是自习室门口排满了队,等待着使用这个单人自习室,张三走到了自习室门口,刚把令牌挂上去。就看到。自习室门一堆的人,想到又是等一下吃完饭再来,又要排很久的队,于是又把令牌拿上进入自习室。由于令牌是张三挂上去的,所以最先拿到令牌的肯定是张三。张三在进入自习室后,肚子依然很饿,于是又把令牌挂上去,但是他又不想排队,又拿上令牌进入自习室,进入自习室肚子又饿也学不好。如此反复,自习室外面的人没有拿到自习室的使用权,而张三又由于肚子饿,也没有利用上这个自习室。

这样就造成了饥饿问题,但是张三有错吗?没错。但是这个策略就有问题

这个时候就要引入条件变量

条件变量

假设自习室门口有一个告示板,上面写着是否允许进入自习室的条件。如果条件不满足(比如自习室满员或者没有空位),学生就在门口等待。当有位置空出时,管理员会在告示板上更新条件,并通知等待的学生。这就是条件变量的基本思想

但是与锁不同的是在这个自习室门口的学生都得排好队,张三出来的时候不能再立马拿令牌,而是要排到队伍后面,这样就解决了饥饿问题。

所以线程排在条件变量的队列里。

http://www.dtcms.com/wzjs/523791.html

相关文章:

  • wordpress百度云对象存储seo快速排名关键词
  • 城乡建设学校网站自媒体平台排名
  • 有关计算机网站建设的论文山东16市最新疫情
  • 视频网站是动态网站吗今天
  • wordpress a5seo关键词是怎么优化的
  • 用vue.js做网站免费学生网页制作成品
  • 网站建设和优化需要几个人爱站数据
  • 网站建设网站模板百度地图导航
  • 重庆网站制作公司多少钱seo公司排名教程
  • 网站建设银行品牌全案策划
  • 可在哪些网站做链接大数据精准营销案例
  • 官方百度整站快速排名优化
  • 深圳哪个网站好推广一点做seo需要用到什么软件
  • 在别人的网站做域名跳转seo内部优化方案
  • 旅游网站建设的经济评价seo积分系统
  • 怎样在微信公众号里做微网站杭州最好的seo公司
  • 影视网站如何做seosem是什么职业岗位
  • 门户网站的定义汽车品牌推广策划方案
  • 哪个网站做logo设计中国十大营销策划公司排名
  • 北京市建设工程交易服务平台历下区百度seo
  • 做分享衣服网站的初衷是什么意思重庆seo优化推广
  • 怎么做网站寄生虫上海网络推广
  • 小型培训机构网站开发毕业设计如何推广app更高效
  • dw做游戏网站代码网站营销软文
  • 禅城网站建设多少钱今天重大新闻头条新闻
  • 做网站主播要什么条件东莞seo外包平台
  • 网站建设包括哪些东莞seo快速排名
  • 网页设计怎么分析网站啊免费发布推广平台
  • 报网站开发培训班世界杯32强排名
  • 网站想要游览怎么做企业管理培训课程报名