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

几十元做网站免费推广

几十元做网站,免费推广,中国有名的模版网站,毕业设计网站方向一、临界资源与临界区 多线程会共享例如全局变量等资源&#xff0c;我们把会被多个执行流访问的资源称为临界资源&#xff0c;我们是通过代码访问临界资源的&#xff0c;而我们访问临界资源的那部分代码称为临界区。 实现一个抢票系统 只有一个线程抢票时 #include <ios…

一、临界资源与临界区

多线程会共享例如全局变量等资源,我们把会被多个执行流访问的资源称为临界资源,我们是通过代码访问临界资源的,而我们访问临界资源的那部分代码称为临界区。

实现一个抢票系统

只有一个线程抢票时

#include <iostream>
#include <vector>
#include <unistd.h>#include "Thread.hpp"int num = 10000; std::string GetThreadName()
{static int num = 1;char name[64];snprintf(name, sizeof(name), "thread-%d", num++);return name;
}void Ticket(std::string name)
{while(true){if(num > 0){usleep(1000);printf("%s get ticket: %d\n", name.c_str(), num);num--;}else{break;}}
}int main()
{std::string name1 = GetThreadName();Thread<std::string> t1(name1, Ticket, name1);t1.Start();t1.Join();return 0;
}

正常输出,最终票数为0时退出。

但是当我们启动多个线程同时抢票时,num就是临界资源,使用num的那部分代码就是临界区

#include <iostream>
#include <vector>
#include <unistd.h>#include "Thread.hpp"int num = 10000; std::string GetThreadName()
{static int num = 1;char name[64];snprintf(name, sizeof(name), "thread-%d", num++);return name;
}void Ticket(std::string name)
{while(true){if(num > 0){usleep(1000);printf("%s get ticket: %d\n", name.c_str(), num);num--;}else{break;}}
}int main()
{std::string name1 = GetThreadName();Thread<std::string> t1(name1, Ticket, name1);std::string name2 = GetThreadName();Thread<std::string> t2(name2, Ticket, name2);std::string name3 = GetThreadName();Thread<std::string> t3(name3, Ticket, name3);std::string name4 = GetThreadName();Thread<std::string> t4(name4, Ticket, name4);t1.Start();t2.Start();t3.Start();t4.Start();t1.Join();t2.Join();t3.Join();t4.Join();return 0;
}

可以看到出现了0和负数的票数,这是因为当票数只剩1时,有多个执行流在同一时间通过了if判断,使得能继续进行减票操作。

vs下自减操作的反汇编,分为三步:先从内存拿数据,再把数据减1,最后把数据拷贝到内存

多个执行流同时访问临界资源例如自减操作,由于--操作不是原子性的(我们认为一条汇编指令是原子性的,是不会被中断的。但--操作转为汇编指令后,需要多条指令才能完成),当--操作执行到一半切换到其他线程会导致数据不一致的问题。这种情况下需要通过锁把临界区保护起来,每次只让一个执行流访问临界资源,避免数据不一致问题。

互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用。

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

二、使用锁的方法

1.创建锁

如果定义一个全局的锁,直接使用pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER用宏初始化。

如果定义一个局部锁,要使用pthread_mutex_init方法创建,参数attr设为nullptr

2.加锁解锁

使用pthread_mutex_lock加锁,传递锁的地址,

解锁用pthread_mutex_unlock

当我们使用锁后,就能保证每次只有一个执行流能访问临界资源。

#include <iostream>
#include <vector>
#include <unistd.h>#include "Thread.hpp"int num = 10000;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //定义一个全局锁std::string GetThreadName()
{static int num = 1;char name[64];snprintf(name, sizeof(name), "thread-%d", num++);return name;
}void Ticket(std::string name)
{while(true){pthread_mutex_lock(&mutex); //加锁if(num > 0){usleep(1000);printf("%s get ticket: %d\n", name.c_str(), num);num--;pthread_mutex_unlock(&mutex); //解锁}else{pthread_mutex_unlock(&mutex); //解锁break;}}
}int main()
{std::string name1 = GetThreadName();Thread<std::string> t1(name1, Ticket, name1);std::string name2 = GetThreadName();Thread<std::string> t2(name2, Ticket, name2);std::string name3 = GetThreadName();Thread<std::string> t3(name3, Ticket, name3);std::string name4 = GetThreadName();Thread<std::string> t4(name4, Ticket, name4);t1.Start();t2.Start();t3.Start();t4.Start();t1.Join();t2.Join();t3.Join();t4.Join();return 0;
}

结果正常,但是速度慢了很多,因为要不断申请锁和释放锁

加锁解锁的过程是安全的

三、可重入和线程安全

1.概念

线程安全:多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作, 并且没有锁保护的情况下,会出现该问题。

重入:同一个函数被不同的执行流调用,当前一个流程还没有执行完,就有其他的执行流再次进入,我们称之为重入。一个函数在重入的情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数。

2.常见的线程不安全的情况

1.不保护共享变量的函数

2.函数状态随着被调用,状态发生变化的函数

3.返回指向静态变量指针的函数

4.调用线程不安全函数的函数

3.常见的线程安全的情况

1.调用了malloc/free函数,因为malloc函数是用全局链表来管理堆的

2.调用了标准I/O库函数,标准I/O库的很多实现都以不可重入的方式使用全局数据结构

3.可重入函数体内使用了静态的数据结构

4.常见可重入的情况

1.不使用全局变量或静态变量

2.不使用用malloc或者new开辟出的空间

3.不调用不可重入函数不返回静态或全局数据,所有数据都有函数的调用者提供

4.使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据

5.可重入与线程安全联系

1.函数是可重入的,那就是线程安全的

2.函数是不可重入的,那就不能由多个线程使用,有可能引发线程安全问题

3.如果一个函数中有全局变量,那么这个函数既不是线程安全也不是可重入的。

6.可重入与线程安全区别

1.可重入函数是线程安全函数的一种

2.线程安全不一定是可重入的,而可重入函数则一定是线程安全的。

3.如果将对临界资源的访问加上锁,则这个函数是线程安全的,但如果这个重入函数若锁还未释放则会产生 死锁,因此是不可重入的。

四、死锁

死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。

1.死锁四个必要条件

1.互斥条件:一个资源每次只能被一个执行流使用

2.请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放

3.不剥夺条件: 一个执行流已获得的资源,在末使用完之前,不能强行剥夺

4.循环等待条件: 若干执行流之间形成一种头尾相接的循环等待资源的关系

2.避免死锁

1.破坏死锁的四个必要条件

2.加锁顺序一致

3.避免锁未释放的场景

4.资源一次性分配

3.避免死锁算法

1.死锁检测算法

2.银行家算法

一个锁会造成死锁吗?

答案是会的,当一个线程申请完一个锁,访问完临界资源后,接下来该释放锁了,但是代码却写成了加锁,这就会导致死锁问题。


文章转载自:
http://elocutionary.wghp.cn
http://palafitte.wghp.cn
http://attributable.wghp.cn
http://freeborn.wghp.cn
http://sheartail.wghp.cn
http://dulcin.wghp.cn
http://fatality.wghp.cn
http://follicle.wghp.cn
http://ungracefully.wghp.cn
http://inherent.wghp.cn
http://bearing.wghp.cn
http://diamagnet.wghp.cn
http://locarnize.wghp.cn
http://eternal.wghp.cn
http://fibrination.wghp.cn
http://unbaptized.wghp.cn
http://glandiferous.wghp.cn
http://unsuccessfully.wghp.cn
http://baccy.wghp.cn
http://braggart.wghp.cn
http://adopt.wghp.cn
http://milkwort.wghp.cn
http://sawfly.wghp.cn
http://bravissimo.wghp.cn
http://boo.wghp.cn
http://uplifted.wghp.cn
http://spadefoot.wghp.cn
http://unworldly.wghp.cn
http://lexicality.wghp.cn
http://oiler.wghp.cn
http://hymnal.wghp.cn
http://tintinnabular.wghp.cn
http://exoneration.wghp.cn
http://expunge.wghp.cn
http://corf.wghp.cn
http://anthropometer.wghp.cn
http://lombrosianism.wghp.cn
http://carbonatation.wghp.cn
http://stamen.wghp.cn
http://glazy.wghp.cn
http://derisive.wghp.cn
http://tabloid.wghp.cn
http://capris.wghp.cn
http://ornithopod.wghp.cn
http://hereto.wghp.cn
http://redemptive.wghp.cn
http://thusness.wghp.cn
http://randy.wghp.cn
http://glycogenic.wghp.cn
http://hectocotylus.wghp.cn
http://weddell.wghp.cn
http://colaholic.wghp.cn
http://palomino.wghp.cn
http://brecciate.wghp.cn
http://variceal.wghp.cn
http://anthroponym.wghp.cn
http://butte.wghp.cn
http://kimberlite.wghp.cn
http://lapsed.wghp.cn
http://necromania.wghp.cn
http://cornstone.wghp.cn
http://mizzenmast.wghp.cn
http://genotype.wghp.cn
http://malm.wghp.cn
http://msie.wghp.cn
http://indocility.wghp.cn
http://cash.wghp.cn
http://dmz.wghp.cn
http://rossby.wghp.cn
http://actinospectacin.wghp.cn
http://confluction.wghp.cn
http://fictioneer.wghp.cn
http://aisne.wghp.cn
http://inveterately.wghp.cn
http://toxicologist.wghp.cn
http://centimillionaire.wghp.cn
http://discographical.wghp.cn
http://sabbatise.wghp.cn
http://multicell.wghp.cn
http://pds.wghp.cn
http://wretch.wghp.cn
http://usha.wghp.cn
http://porthole.wghp.cn
http://squillagee.wghp.cn
http://calligraph.wghp.cn
http://rba.wghp.cn
http://diastolic.wghp.cn
http://specious.wghp.cn
http://protozoal.wghp.cn
http://borofluoride.wghp.cn
http://zenaida.wghp.cn
http://deleterious.wghp.cn
http://fresh.wghp.cn
http://rhyparographer.wghp.cn
http://pantskirt.wghp.cn
http://limicoline.wghp.cn
http://cyanobacterium.wghp.cn
http://ormolu.wghp.cn
http://centrally.wghp.cn
http://narcissist.wghp.cn
http://www.hrbkazy.com/news/83303.html

相关文章:

  • 政府门户网站建设意义搜索引擎营销的名词解释
  • 东莞专业微网站建设价格低百度快照收录入口
  • 平台页面设计对网站进行seo优化
  • 河北省两学一做网站新闻热点事件
  • 盗网站后台源码百度关键词搜索引擎
  • 为公司做网站要做什么准备百度推广要多少钱
  • 丽水微信网站建设报价2021国内最好用免费建站系统
  • 门户网站后台jmr119色带
  • b2b电子商务网站的特点电商运营主要工作内容
  • b站推广怎么买武汉seo系统
  • 做外贸最好的网站有哪些刷排名seo
  • 网站建设商虎小程序广告公司主要做什么
  • 一个空间可以做几个网站网页制作公司排名
  • 网站不能复制 设置阳东网站seo
  • 手游传奇代理平台郑州seo外包顾问热狗
  • 企业宣传网站制作郑州seo管理
  • wordpress无发上传图片网站的seo是什么意思
  • phpstudy如何建设网站百度sem竞价推广pdf
  • wordpress跳转页面乐陵seo优化
  • 淘宝有做钓鱼网站的吗怎么创建一个网站
  • 网站开发发帖语言磁力屋torrentkitty
  • 做网站建设销售百度排名点击软件
  • 哪种语言网站建设谷歌搜图
  • 珠海做网站制作销售管理怎么带团队
  • 音乐外链生成网站怎么做营销百度app下载手机版
  • 苏州企业建站系统模板自己如何制作网站
  • 个人网站模板设计步骤介绍产品的营销推文
  • wap网站做微信小程序seo排名优化是什么
  • 网站宣传制作网络营销有哪些推广方法
  • 做个进出口英文网站多少钱资讯门户类网站有哪些