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

网站开发管理制度wordpress百度xml地图

网站开发管理制度,wordpress百度xml地图,中科网站建设,家具设计理念今天在评审代码的时候#xff0c;因为位于两个不同的线程中#xff08;一个是周期性事件线程#xff0c;一个是触发式事件线程#xff09;#xff0c;需要对一个资源类的某些属性进行互斥的访问#xff0c;因此采用lock_guard互斥量包装器#xff0c;但是在升级的过程中… 今天在评审代码的时候因为位于两个不同的线程中一个是周期性事件线程一个是触发式事件线程需要对一个资源类的某些属性进行互斥的访问因此采用lock_guard互斥量包装器但是在升级的过程中因为整个系统太大所以在询问了某位同事后得到的答案是在两个不同的地方加上lock_guard有一定的可能性会导致死锁但是后面在测试的过程中又没有问题真的如此吗本文针对lock_guard来做阐述和延申 历史原因为什么要使用lock_gurad有什么优点 传统的C对互斥量加锁是用互斥量本身的锁的即 #include mutexstd::mutex g_mutex;// 加锁 g_mutex.lock(); // 解锁 g_mutex.unlock();此时会有两个不便利处即要手动的解锁如果忘了解锁那就完蛋了因此采用lock_guard #include mutexstd::mutex g_mutex;{ // 作用域开始std::lock_guardstd::mutex lock(g_mutex); } // 作用域结束lock_guard以作用域为加解锁单位退出当前作用域自动解锁不必手动解锁。总结一下它的优点 RAII资源获取即初始化语法std::lock_guard 使用对象的构造函数和析构函数来自动管理互斥量的锁定和解锁从而避免了手动管理锁的复杂性。这种自动化的资源管理方式确保在作用域结束时释放锁防止忘记解锁而导致的资源泄漏或死锁异常安全由于 std::lock_guard 使用RAII语法即使在作用域内发生异常也会自动调用析构函数释放锁确保了异常安全性。这样可以避免在异常发生时锁没有被释放而导致的资源泄漏或死锁简单易用std::lock_guard 提供了一种简单而直观的方式来管理互斥量不需要手动调用 lock() 和 unlock() 函数因此代码更加简洁清晰易于理解和维护避免死锁由于 std::lock_guard 在构造时立即锁定互斥量在析构时立即释放互斥量因此减少了出现死锁的可能性。通过使用 std::lock_guard程序员可以更容易地确保正确的加锁和解锁顺序从而避免死锁线程安全性std::lock_guard 是线程安全的可以在多线程环境下安全地使用。它能够确保在同一时间只有一个线程可以访问被互斥量保护的资源从而保证了线程安全性 lock_guard和unique_lock的区别 延迟加锁可以在构造时不立即锁定互斥量在需要时手动调用 lock() 函数来锁定互斥量。这种延迟加锁的特性允许在一段代码中多次锁定和解锁互斥量提供了更多的灵活性 void FunThread() {std::unique_lockstd::mutex lock(mtx, std::defer_lock); // 延迟加锁此时不加锁lock.lock(); // 加锁//lock.unlock(); // 解锁 }条件等待提供了与条件变量一起使用的功能可以在条件变量的等待和通知过程中自动锁定和解锁互斥量。通过将 std::unique_lock 对象传递给条件变量的wait()和 notify_*() 函数可以轻松实现条件等待的功能 配合条件变量使用的时候必须使用unique_lock因此lock_guard不会自动释放锁试想在wait之前本线程已经持有锁了在等待的时候如果一直持有互斥量那其他线程也会拿不到互斥量执行不了逻辑则会导致永久死锁可见源码 template class _Lock, class _Predicatebool wait(_Lock __lock,stop_token __stoken,_Predicate __p){if (__stoken.stop_requested()){return __p();}std::stop_callback __cb(__stoken, [this] { notify_all(); });shared_ptrmutex __mutex _M_mutex;while (!__p()){unique_lockmutex __my_lock(*__mutex);if (__stoken.stop_requested()){return false;}// *__mutex must be unlocked before re-locking __lock so move// ownership of *__mutex lock to an object with shorter lifetime._Unlock_Lock __unlock(__lock); // 先解锁unique_lockmutex __my_lock2(std::move(__my_lock));_M_cond.wait(__my_lock2);}return true;}{std::unique_lockstd::mutex lock(g_mutex);g_condition.wait(lock, [] { // condition }); // 等待队列不为空的才去获得锁 }所有权转移支持所有权转移允许将互斥量的所有权从一个std::unique_lock对象转移到另一个对象。这使得在一段代码中传递互斥量的所有权变得更加方便 void Fun2(std::unique_lockstd::mutex lock) {// 手动解锁锁lock.unlock(); } void Fun1() {std::unique_lockstd::mutex lock(mtx);std::thread F(Fun2, std::move(lock)); }性能损失与 std::lock_guard 相比std::unique_lock 有一些性能损失因为它需要更多的控制和管理互斥量的状态包括手动加锁、解锁和条件等待。但是这种性能损失通常是微不足道的并且可以通过使用std::defer_lock 参数来避免 还有一个scope_lock在此不做介绍 lock_guard小demo读写队列 /** Author: LiuHao* Date: 2024-03-24 01:40:15* Description: 测试C的互斥量包装器*/#include thread #include mutex #include iostream #include deque #include vector #include condition_variablestd::mutex g_mutex; // 互斥量 std::dequeuint8_t g_deque; // 双端队列 std::condition_variable g_condition; // 条件变量namespace LHSpace { // 解决cout不能直接输出uint8_t的值的问题class LHCout {public:template typename Ttypename std::enable_ifstd::is_sameT, uint8_t::value, LHCout::type operator(const T num){std::cout static_castint(num);return *this;}LHCout operator(std::ostream (*manipulator)(std::ostream)){std::cout manipulator;return *this;}}; }demo组成 十个写线程一个循环读线程 写线程函数 void SetPrint(const uint8_t val) {LHSpace::LHCout lhCout;{std::lock_guardstd::mutex lock(g_mutex);std::cout Write Thread ID: std::this_thread::get_id() std::endl;g_deque.push_back(val); // 末尾添加一个元素std::cout deque push: ;lhCout val std::endl;}g_condition.notify_one(); // 使用条件变量std::this_thread::sleep_for(std::chrono::seconds(1)); }读线程函数 void GetPrint() {LHSpace::LHCout lhCout;while (true) { // 每一次退出作用域就丢掉锁std::unique_lockstd::mutex lock(g_mutex);g_condition.wait(lock, [] { return !g_deque.empty(); }); // 等待队列不为空的才去获得锁const uint8_t FRONTNUM g_deque.front();g_deque.pop_front();lock.unlock();std::cout Read Thread ID: std::this_thread::get_id() std::endl;std::cout deque pop: ;lhCout FRONTNUM std::endl;std::this_thread::sleep_for(std::chrono::milliseconds(500));} }创建并启动线程 int main(int argc, const char** argv) {LHSpace::LHCout lhCout;std::vectorstd::thread writeThreads;for (uint8_t i 0U; i 10U; i) {writeThreads.push_back(std::thread(SetPrint, i)); // 读线程}std::thread getThread(GetPrint); // 读线程for (uint8_t i 0U; i 10U; i) {writeThreads[i].join();}getThread.join();return 0; }来看看具体运行过程感受一下多线程的魅力 ubuntuVM-8-16-ubuntu:~/tmp$ ./a.out Write Thread ID: 140363031643712 deque push: 2 # 写 Write Thread ID: 140363023251008 deque push: 3 # 写 Read Thread ID: 140362964502080 deque pop: 2 # 读 Write Thread ID: 140363040036416 deque push: 1 # 写 Write Thread ID: 140363048429120 deque push: 0 # 写 Write Thread ID: 140363014858304 deque push: 4 # 写 Read Thread ID: 140362964502080 deque pop: 3 # 读 # ...
http://www.hkea.cn/news/14594409/

相关文章:

  • 网站每年续费费用个人简历免费制作网站
  • 网站建设为什么要全款如何做好网站建设的要点
  • 网站建设公司小江龙岩天宫山天气预报
  • 做美工要开通什么网站的会员呢女性logo大全图片
  • 钓鱼网站的危害梅县区住房和城市建设局网站
  • 网站域名过期2022最近比较火的热点话题
  • hugo 怎么做网站网站设计中国内优秀企业网站欣赏
  • 个人网站优秀作品横沥镇网站仿做
  • 湖南3合1网站建设价格抖音代运营是怎么回事
  • 专业的公司网站建设产品单页设计图片
  • 百度搜索引擎的网址是北京seo技术
  • 做网站有名的公司有哪些ui设计属于视觉传达吗
  • 学做网站论坛好吗wordpress悬赏
  • 快速提高网站权重i营销
  • 中山建设公司网站象58同城网站建设需要多少钱
  • 网站分级怎么做廊坊网站建设公司费用
  • 做任务网站有哪些好用的推广平台
  • 站长工具免费泰州泛亚信息做网站怎么样
  • 网上找兼职的网站怎么查询网站建设时间
  • 几十个必备的设计师灵感网站wordpress 外链缩略图
  • wordpress 导航网站模板下载网站开发 聊天窗口
  • 中国三北防护林体系建设网站免费的网络推广渠道
  • 备案公司网站建设方案书中山做营销型网站公司
  • 深圳手机网站建设牛商网wordpress获取五条数据
  • 手机网站搭建企业邮箱腾讯
  • 环保局网站建设京津冀协同发展意义
  • 网站代码开发定制成都代理注册公司电话
  • 外贸建站wordpress湖北城市建设职业技术学院网站
  • 网站制作的常见布局长春火车站是哪个站
  • 网站建设都需要那些材料沧州网站建设申梦