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

浏览器打开用dw做的网站说外贸soho虚拟公司做网站

浏览器打开用dw做的网站说,外贸soho虚拟公司做网站,dede网站仿站经典工具,免费商城系统源码为什么要使用锁、信号量、条件变量#xff1f; 网站不可能是单线程的#xff0c;否则网站的性能和响应都会收到严重的影响。因此#xff0c;这个项目一定是运行在多线程条件下的。而在多线程条件下#xff0c;对共享资源的互斥访问就极其重要。 为什么要将资源封装成类 网站不可能是单线程的否则网站的性能和响应都会收到严重的影响。因此这个项目一定是运行在多线程条件下的。而在多线程条件下对共享资源的互斥访问就极其重要。 为什么要将资源封装成类 首先我们要明确资源的使用一般有三个步骤 1、获取资源 2、使用资源 3、释放资源 然而大多数情况下我们一定能做到前两点而总是忘记第三步这就会造成资源的泄露。为了解决这个问题提出了RAII方案中文翻译是资源获取即初始化也就是使用局部对象来管理资源的技术。 最直观的就是将资源封装成类 在构造函数中获取资源在析构函数中释放资源这样当变量离开了作用域后编译器会调用析构函数而析构函数会帮助我们将资源释放掉这样就避免了我们忘记释放资源的情况。 本项目中作者就将锁、互斥量、条件变量进行了封装。有以下好处 自动资源管理RAII模式允许资源的获取和释放与对象的生命周期绑定在一起。当对象被创建时资源被获取当对象被销毁时资源被释放。这消除了手动管理资源的需要减少了错误的机会。 异常安全性RAII模式提供了异常安全性因为资源的释放操作通常在对象的析构函数中执行。如果在使用资源的过程中发生异常对象的析构函数会被自动调用确保资源被正确释放防止资源泄漏。 避免忘记释放资源使用RAII模式开发人员不需要显式地记住在何处释放资源。资源的释放是自动的因此避免了因忘记释放资源而引发的问题。 代码可读性RAII模式使代码更加清晰和容易理解。资源的获取和释放操作都在对象的构造函数和析构函数中使得代码更加自文档化。 资源的精确生命周期控制RAII模式允许在对象的生命周期内对资源的生命周期进行精确的控制。资源在对象的构造和析构之间一直存在不会在对象的其他方法之外被访问。 并发安全性RAII模式可以用于管理锁、信号量等同步资源确保线程安全性。资源在锁住和释放锁时被获取和释放从而避免了竞态条件和死锁等问题。 互斥锁、条件变量、信号量是如何工作的 互斥锁提供互斥访问的能力来确保同一时间只有一个线程能够访问共享资源。 1. 锁初始化创建锁并进行初始化 2. 加锁当线程需要访问共享资源时尝试获取互斥锁如果已经被别的线程占用那么该线程会被阻塞直到锁可用 3. 访问共享资源获取锁后线程访问共享资源 4. 解锁该线程访问完共享资源后释放互斥锁使其他等待的线程可以获得锁并访问资源。 条件变量通常和互斥锁一起使用条件变量用于等待某个条件满足后再继续执行。 1. 等待条件线程获取互斥锁后发现条件不足进入阻塞状态释放互斥锁让其他进程可以访问共享资源 2. 唤醒等待进程当条件满足后某个线程通过条件变量发出信号唤醒一个或多个等待的线程这些线程被唤醒后后会尝试重新获取互斥锁。 信号量用于控制多个线程对有限资源的访问。通常有两种 1.二进制信号量非0即1用于互斥访问共享资源。等待信号量为1时获得访问权将信号量设置为0访问结束后将信号量值设为1 2. 计数信号量可以具有1的值控制多个线程对一组有限资源的访问。线程获得资源信号量值变小释放资源信号量值变大当信号量值为0时需要阻塞线程。 下面我们来看作者的源代码 #ifndef LOCKER_H #define LOCKER_H#include exception #include pthread.h #include semaphore.hclass sem { public:sem(){if (sem_init(m_sem, 0, 0) ! 0){throw std::exception();}}sem(int num){if (sem_init(m_sem, 0, num) ! 0){throw std::exception();}}~sem(){sem_destroy(m_sem);}bool wait(){return sem_wait(m_sem) 0;}bool post(){return sem_post(m_sem) 0;}private:sem_t m_sem; }; class locker { public:locker(){if (pthread_mutex_init(m_mutex, NULL) ! 0){throw std::exception();}}~locker(){pthread_mutex_destroy(m_mutex);}bool lock(){return pthread_mutex_lock(m_mutex) 0;}bool unlock(){return pthread_mutex_unlock(m_mutex) 0;}pthread_mutex_t *get(){return m_mutex;}private:pthread_mutex_t m_mutex; }; class cond { public:cond(){if (pthread_cond_init(m_cond, NULL) ! 0){//pthread_mutex_destroy(m_mutex);throw std::exception();}}~cond(){pthread_cond_destroy(m_cond);}bool wait(pthread_mutex_t *m_mutex){int ret 0;//pthread_mutex_lock(m_mutex);ret pthread_cond_wait(m_cond, m_mutex);//pthread_mutex_unlock(m_mutex);return ret 0;}bool timewait(pthread_mutex_t *m_mutex, struct timespec t){int ret 0;//pthread_mutex_lock(m_mutex);ret pthread_cond_timedwait(m_cond, m_mutex, t);//pthread_mutex_unlock(m_mutex);return ret 0;}bool signal(){return pthread_cond_signal(m_cond) 0;}bool broadcast(){return pthread_cond_broadcast(m_cond) 0;}private://static pthread_mutex_t m_mutex;pthread_cond_t m_cond; }; #endif 互斥锁和信号量是简单的封装而对于条件变量作者注释掉了互斥锁但并不会影响互斥访问因为作者选择用封装好的互斥锁并且在外部来使用。例如在block_queue.h这个文件中作者将locker m_mutex;作为私有数据成员并通过get函数获得该锁。 template class T class block_queue { public:...if (!m_cond.timewait(m_mutex.get(), t)){m_mutex.unlock();return false;}... private:locker m_mutex;... }
http://www.zqtcl.cn/news/889680/

相关文章:

  • 规划电子商务网站流程福清建设局网站简介
  • 使用joomla的网站网络营销师资格证有什么用
  • 做经营网站怎么赚钱吗关于做网站的合同
  • 上海手机网站建设哪家好重庆景点
  • 做网站菜单背景图片wordpress伪原创词库
  • 网络维护工程师工资多少聊城哪里做优化网站
  • 网站开发用什么字体查询域名备案
  • 济南品牌网站建设公司网站单个页面紧张搜索引擎蜘蛛
  • 公司需要一个简单的网站包头网站建设奥北
  • 怎么制作网站导航页新手做网站详细步骤
  • 自己个人网站后台怎么做wordpress多程序用户同步
  • 赣州网联科技有限公司wordpress安装后优化
  • 二手书的网站建设做设计在哪个网站找图片大全
  • 网站seo设计北京市建设投标网站
  • 承德做网站设计的网络推广主要内容
  • 婚纱网站源代码重庆网站定制公司
  • 同一个ip网站太多 seo应用商店网站源码
  • 网站内容框架首页>新闻>正文 网站怎么做
  • 网站制作 搜索做效果图网站有哪些
  • 网站建设的相关技术网站的购物车怎么做
  • 免费建设公司网站腾讯云域名购买
  • 淘宝客网站应该怎么做网页浏览器推荐
  • 怎样做影视网站不侵权商丘专业做网站
  • 哪个网站做刷手最好鹤壁 网站建设
  • 设计接单子网站安徽网站开发推荐
  • 网站建设制作 优帮云怎样注册商标申请
  • 网站怎么做交易市场苏州吴江做网站公司
  • wordpress的字体禁用优化设计的答案
  • 网站建设开发五行属性如何做二级域名网站
  • 珠海做网站的公司介绍最近的新闻大事