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

哪些网站可以免费做产品推广建设建设部网站

哪些网站可以免费做产品推广,建设建设部网站,山东政务网站建设,vps里面设置了一下读取和写入网站无法显示了有了之前对线程的初步了解我们学习了什么是线程#xff0c;线程的原理及其控制。这篇文章将继续讲解关于线程的内容以及重要的知识点。 线程的优缺点#xff1a; 线程的缺点 在这里我们来谈一谈线程健壮性#xff1a; 首先我们先思考一个问题#xff0c;如果一个线程出现…       有了之前对线程的初步了解我们学习了什么是线程线程的原理及其控制。这篇文章将继续讲解关于线程的内容以及重要的知识点。 线程的优缺点 线程的缺点 在这里我们来谈一谈线程健壮性 首先我们先思考一个问题如果一个线程出现了问题那么它会影响其他线程吗 我们写代码验证一下 #include iostream #include string #include unistd.h using namespace std;void* start_route(void* args) {string name static_castchar*(args);while(true){cout我是一个新线程我的名字是nameendl;sleep(1);}}int main() {pthread_t id;pthread_create(id,nullptr,start_route,(void*)thread one);while(true){cout我是主线程endl;sleep(1);}return 0;} 代码运行的结果如下 我们用ps命令进行查看 pid和lwp的值相同的是主线程 不一样的是创建出来的新线程。我们继续修改代码使其中的一个线程崩溃看看会不会影响另一个进程 结果如下 当我们再用ps命令进行查找时发现两个线程不复存在原因是当一个线程对野指针进行访问时操作系统会发送信号终止进程而两个线程的pid相同同属于一个进程因此两个线程同时崩溃 之前我们说过操作系统里面没有真正线程的概念它只提供轻量级进程的使用接口而创建进程或者线程底层调用的是clone 这里我们了解一下底层使用的接口就行我们还是使用平常用的fork和pthread_create创建。 如何看待线程库语言版 #include iostream #include string #include unistd.h #include threadvoid* thread_run() {while(true){std::cout我是一个新线程std::endl;}}int main() {std::thread t1(thread_run);while(true){std::cout我是主线程std::endl;}t1.join(); }当我们用c11中的线程时不引入线程库时程序运行报错 错误显示有未被定义的“pthread_create,由此可以看出在linux环境下c语言中的线程本质是对linux底下线程库的进一步封装。 上面的代码也能在windows底下运行因为语言帮我们解决了平台差异性问题实现了跨平台而原生线程库的接口都是不可跨平台的暴露和使用原生线程库都是自己决定的 全局变量的安全性 现在我们写一个抢票的代码抢票逻辑没有任何问题。但如果多个线程并发的执行就会出现bug #include iostream #include string #include unistd.h #include memory #include Thread.hppint ticket 10000; void *getTicket(void *args) {string username static_castconst char *(args);while (true){if (ticket 0){usleep(1234);std::cout username 正在抢票: ticket std::endl;--ticket;}else{break;}} }int main() {std::unique_ptrThread thread1(new Thread(getTicket, (void *)user1, 1));std::unique_ptrThread thread2(new Thread(getTicket, (void *)user2, 2));std::unique_ptrThread thread3(new Thread(getTicket, (void *)user3, 3));std::unique_ptrThread thread4(new Thread(getTicket, (void *)user4, 4));thread1-start();thread2-start();thread3-start();thread4-start();thread1-join();thread2-join();thread3-join();thread4-join();return 0; } 运行结果 这时我们发现票数竟然变成了负数原因就是当我们进行usleep操作时线程被不停的切换。例如线程a刚进入判断语句相对票数进行减减时线程a被切换保存在寄存器的上下文也相应地被切走。这时线程b又来了它和线程a就一起进入了判断语句对票数进行删减操作。当b进行了20次循环操作假设票数减了20次但这时线程a又被切换回来时cpu先读取线程a中的上下文在进行减减操作最后再将结果写回到内存中。这样线程b再回来的时候结果就变得翻天覆地 发生以上问题的原因主要是、--操作不是原子性的在汇编语句上至少是三条语句 在这里我先补充一些概念 临界资源多个执行流进行安全访问的共享资源。 临界区多个执行流中访问临界资源的代码。--往往是代码的很小一部分 互斥让多个执行流串行访问共享资源。 原子性对一个资源进行访问时要么不做要么就一次性做完。换句话来说执行的语句用一条汇编就能完成。 解决以上问题的手段加锁!!!!! 锁的常用接口 锁的初始化 当你定义一个锁时如果是全局锁就可以用以下方式定义‘ 初始化以后就不需要对锁进行以下接口的调用 但如果是一个局部的锁就需要对锁进行以上的初始化和销毁的操作。下面定义的一个全局锁 lock和unlock之前的代码区域就是临界区临界区中访问的ticket就是临界资源访问它们的方式都是安全的! 现在我们使用一个局部的锁全局的锁太简单 class ThreadData { public:ThreadData(const stringthreadname,pthread_mutex_t* pmutex nullptr):_threadname(threadname),_pmutex(pmutex){}~ThreadData(){}public:string _threadname;pthread_mutex_t* _pmutex;};int ticket 10000; void *getTicket(void *args) {ThreadData* td static_castThreadData*(args);while (true){pthread_mutex_lock(td-_pmutex);if (ticket 0){usleep(1234);std::cout td-_threadname 正在抢票: ticket std::endl;--ticket;pthread_mutex_unlock(td-_pmutex);}else{pthread_mutex_unlock(td-_pmutex);break;}}return nullptr; }int main() {#define NUM 4pthread_mutex_t lock;pthread_mutex_init(lock,nullptr);vectorpthread_t tids(NUM);for(int i0;iNUM;i){char buffer[64];snprintf(buffer,sizeof buffer,thread %d,i1);ThreadData* td new ThreadData(buffer,lock);pthread_create(tids[i],nullptr,getTicket,td);}for(const auto tid:tids){pthread_join(tid,nullptr);}pthread_mutex_destroy(lock);return 0; } 当我们用了全局所以后发现几个现象 1.抢票的速度变慢了!!!原因就是加锁和解锁的过程是多个线程串行执行的。 2.抢票的时候基本上都是一个线程抢了好多票其他线程没有机会抢票。原因锁只是规定互斥访问锁是多个执行流竞争的结果。因为我们抢票的逻辑还不完整导致一个线程释放锁以后这个线程再次进入循环申请锁。抢完票以后不应该立即再次进入循环而是出现抢票结果的响应但我们没有写简单的用usleep最后一行代替一下 现在我们来谈一谈对锁的认识 1.锁是用来保护共享资源时其变得安全但多个执行流申请锁致使锁也是个共享资源。因此申请锁和释放锁也是原子性的。 2.使用锁来保护共享资源实际上是一个执行流串行运行的结果。因此为了提高效率和速度用锁保护的代码区域的粒度越小越好。 3.如果一个线程申请锁成功即使线程被切换它是抱着锁被切换走的!!因此当另一个线程来申请锁的时候就必须挂起等待。我们所学的锁也称为挂起等待锁。 4.谁持有锁谁就进入临界区!!!!! 锁的原子性实现原理 在理解原理之前我们必须要有两个共识 1.cpu只有一套寄存器被所有执行流共享。 2.cpu内寄存器的内容是每个执行流私有的是执行流的上下文。 现在我为大家展示底层原理的代码实现 为了保证申请锁和释放锁的原子性大多数体系结构都提供了swap或exchange指令它们的作用就是将寄存器里的数据和内存里的数据进行交换并且是一步到位。 保证申请锁为原子性的方式如下 首先1代表有锁0代表没有锁先将0置于一个线程的寄存器中使寄存器中的数值成为线程a的上下文 然后使用exchange指令将寄存器中的0和内存中的1进行交换这样线程a就持有了锁 由于交换数值在汇编上只有一条指令因此保证了申请锁的原子性那么锁被申请到了线程a能被随意的切走吗答案是当然可以因为线程a被切走时它的上下文也随之被切走因此当别的进程来申请锁时就申请不到内存中的锁了内存中数值为0表示没有锁因此被挂起等待。 如果这是线程a又被切回来它会带着它的1它自己的上下文回来。这时就保证了只有一个持有锁的进程能够访问临界资源释放锁的原理和上面差不多这里就不多说了。这时有人会问假如我让一个几个线程必须持有锁才能访问资源让一个线程不需要锁进行访问那不就不能保证只有一个线程访问了吗 ---------------这里必须强调一下加锁使程序员的工作要访问就必须让所有线程持有锁访问如果搞特殊的话这是你程序员自己代码上的失误喔 锁的封装设计RAII 首先我们来介绍一下什么是RAII 以下是代码的实现 class Mutex { public:Mutex(pthread_mutex_t* pmutex nullptr):_pmutex(pmutex){}void lock(){if(_pmutex) pthread_mutex_lock(_pmutex);}void unlock(){if(_pmutex) pthread_mutex_unlock(_pmutex);}~Mutex(){}pthread_mutex_t* _pmutex; };class Guard_Mutex { public:Guard_Mutex(pthread_mutex_t* pmutex):_mutex(pmutex){_mutex.lock(); //构造函数中进行加锁}~Guard_Mutex(){_mutex.unlock(); //析构函数中进行解锁}private: Mutex _mutex;}; 可重入和线程安全 重入的概念同一个函数被不同的执行流调用。一个执行流还没有调用完其他执行流就再次进入这个函数。 可重入的概念一个函数在重入的前提结果不会出现任何的问题则称为可重入函数。 线程安全多个线程并发同一段代码时不会出现不同的结果。常见对全局变量或者静态变量进行操作并且没有锁保护的情况下会出现该问题。 常见可重入的情况 前面讲了这么多相信大家听的云里雾里的总结一句话就是可重入是形容函数的而线程安全表现的是整个程序运行的结果正不正确例如有没有对全局变量的数据做保护、有没有对函数里的共享资源上锁等等。线程安全可能调用函数也可能不调用。因此可重入函数一定是线程安全的而线程安全不一定是可重入的。 常见锁概念 死锁的概念 多个线程在不释放自己锁资源的情况下不断的请求对方的锁资源而导致永久等待的状态。 死锁产生的四个必要条件 1.互斥这是锁的特性每个资源每次只能被一个执行流使用。 2.请求与保持条件对自己已经获得的资源不释放并且不断请求对方的资源。 3.不剥夺不强行获取对方的资源。 4.环路等待若干执行流之间形成头尾相连的循环等待资源的关系。 破坏死锁的方法 为了解决死锁问题我们至少需要破坏死锁的必要条件中的一个。因为互斥是锁的基本特性如果没有所那还谈什么死锁呢所以互斥条件我们是没有办法解决的。因此我们根据后三条来解决 不请求与保持如果一个执行流申请锁失败时可以先立即释放自己拥有的锁资源。 剥夺提高某些执行流的优先级我们当前执行流需要锁却申请不到直接强行将锁给它。 破坏环路等待如果有两把锁A、B两个执行流依次以A、B的顺序申请和释放锁而不是一个先申请A后申请B一个先申请B再申请A。 到这里线程中篇就结束了线程下篇持续更新希望大家多多支持
http://www.w-s-a.com/news/500584/

相关文章:

  • 网站开发销售怎么做django做网站
  • 淘宝客网站做百度竞价万网域名怎么绑定网站
  • 建设网站找哪个公司北京知名大公司有哪些
  • 专业彩票网站开发网站流量在哪设置
  • 网站建设对应的岗位榆林做网站公司
  • 网站建设公司怎么算专业js网站分页怎么做
  • 网和网站的区别phpcms和帝国cms哪个好
  • wordpress改网站名字长沙网络营销外包
  • 宝塔怎么做第二个网站网站内容设计遵循的原则有
  • 网站违反了 google 质量指南免费ppt模版网站
  • 郑州网站建设郑州网站建设成都那家网站建设好
  • 温州网站排名优化公司如何招聘软件网站开发人员
  • 成都 网站建设公司哪家好襄阳行业网站建设
  • wordpress 调用时间做网站seo的公司哪家好
  • 手机上网站搭建网站账户系统
  • 西乡网站的建设柳州建站
  • 宁夏网站建设怎么样互联网 网站设计
  • 成都关键词seo推广平台手机端关键词排名优化软件
  • 学做软件的网站卡盟平台
  • 网站构建建设案例展示关于做服饰网站的首页
  • 如何建设网站论坛凡科建站手机版登录
  • 建设银行门户网站惠州公司网站建设价格
  • 用python开发网站网站如何取消验证码
  • 公司做企业网站互联网建网站
  • 建网站需要的费用公司注册后怎么做网站
  • 宣传电脑的网站开发运动网站建设教程
  • 网站建设公司都会有哪些花销做网站公司商丘
  • 网站风格有哪些软件定制和开发
  • 公司网络维护具体做什么河南网站推广优化公司哪家好
  • 中学生制作的网站常平哪里有招计算机网站开发的