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

南梁红色景区建设管理局网站外协机械加工网

南梁红色景区建设管理局网站,外协机械加工网,网站后台 设计,深圳宣传片制作文章目录 1. 为何要引入互斥包装器#xff1f;2. lock_guard3. unique_lock4. 两者之间的不同5. 总结 1. 为何要引入互斥包装器#xff1f; 在C多线程中会经常用到mutex#xff0c;在使用的时候lock后#xff0c;有时候会忘记使用unlock进行解锁造成死锁#xff0c;或者在… 文章目录 1. 为何要引入互斥包装器2. lock_guard3. unique_lock4. 两者之间的不同5. 总结 1. 为何要引入互斥包装器 在C多线程中会经常用到mutex在使用的时候lock后有时候会忘记使用unlock进行解锁造成死锁或者在lock和unlock之间代码异常跳出导致程序无法执行到unlock造成死锁因此在C11中引入互斥体包装器互斥体包装器为互斥提供了便利的RAII风格机制本质上就是在包装器的构造函数中加锁在析构函数中解锁将加锁和解锁操作与对象的生存期深度绑定防止使用mutex加锁lock后忘记解锁unlock或者两者之间出现异常退出等造成死锁。 RAII(Resource Acquisition Is Initialization, 资源获取即初始化) RAII是一种 C 编程技术 它将必须在使用前请求的资源分配的堆内存、执行线程、打开的套接字、打开的文件、锁定的互斥体、磁盘空间、数据库连接等——任何存在受限供给中的事物的生命周期与一个对象的生存期相绑定。RAII 保证资源能够用于任何会访问该对象的函数资源可用性是一种类不变式这会消除冗余的运行时测试。它也保证对象在自己生存期结束时会以获取顺序的逆序释放它控制的所有资源。 C11提供了lock_guard和unique_lock两种互斥包装器。 2. lock_guard 类 lock_guard 是互斥体包装器为在作用域块期间占有互斥提供便利RAII风格机制。其在头文件mutex中定义其函数原型如下 template class Mutex class lock_guard;其构造函数如下 //等效地调用 m.lock() explicit lock_guard( mutex_type m ); //C11 起//获得互斥 m 的所有权而不试图锁定它。若当前线程不在 m 上保有非共享锁 //即由 lock、 try_lock、 try_lock_for 或 try_lock_until //取得的锁则行为未定义。 lock_guard( mutex_type m, std::adopt_lock_t t ); //C11 起//复制构造函数被删除 lock_guard( const lock_guard ) delete; //C11 起析构函数如下 //释放所占有互斥的所有权。 //等效地调用 m.unlock() , //其中 m 是传递个 lock_guard 的构造函数的互斥 ~lock_guard(); //C11 起创建 lock_guard 对象时它试图接收给定互斥的所有权。控制离开创建 lock_guard 对象的作用域时销毁 lock_guard 并释放互斥。lock_guard 类不可复制。 注若 m 先于 lock_guard 对象被销毁则行为未定义。 示例 #include thread #include mutex #include iostreamint g_i 0; std::mutex g_i_mutex; // 保护 g_ivoid safe_increment() {std::lock_guardstd::mutex lock(g_i_mutex);g_i;std::cout std::this_thread::get_id() : g_i \n;// g_i_mutex 在锁离开作用域时自动释放 }int main() {std::cout main: g_i \n;std::thread t1(safe_increment);std::thread t2(safe_increment);t1.join();t2.join();std::cout main: g_i \n; }可能的输出 main: 0 140641306900224: 1 140641298507520: 2 main: 23. unique_lock 类unique_lock也是C11提供的一种通用互斥包装器它允许延迟锁定、锁定的有时限尝试、递归锁定、所有权转移和与条件变量一同使用。其也在头文件 mutex中定义其构造函数如下 //构造无关联互斥的 unique_lock unique_lock() noexcept; //C11 起//移动构造函数。以 other 的内容初始化 unique_lock 。令 other 无关联互斥 unique_lock( unique_lock other ) noexcept; //C11 起// 构造以 m 为关联互斥的 unique_lock // 通过调用 m.lock() 锁定关联互斥 explicit unique_lock( mutex_type m ); //C11 起// 构造以 m 为关联互斥的 unique_lock // 不锁定关联互斥 unique_lock( mutex_type m, std::defer_lock_t t ) noexcept; //C11 起// 构造以 m 为关联互斥的 unique_lock // 通过调用 m.try_lock() 尝试锁定关联互斥而不阻塞。 // 若 Mutex 不满足可锁定 (Lockable) 则行为未定义 unique_lock( mutex_type m, std::try_to_lock_t t ); //C11 起// 构造以 m 为关联互斥的 unique_lock // 假定调用方线程已保有 m 上的非共享锁即由 lock、 try_lock、 try_lock_for // 或 try_lock_until 取得的锁。若非如此则行为未定义 unique_lock( mutex_type m, std::adopt_lock_t t ); //C11 起// 构造以 m 为关联互斥的 unique_lock // 通过调用 m.try_lock_for(timeout_duration) 尝试锁定关联互斥。 // 阻塞到经过指定的 timeout_duration 或获得锁这两个事件的先到来者为止 template class Rep, class Period unique_lock( mutex_type m,const std::chrono::durationRep,Period timeout_duration ); //C11 起// 构造以 m 为关联互斥的 unique_lock // 通过调用 m.try_lock_until(timeout_time) 尝试锁定关联互斥。 // 阻塞到抵达指定的 timeout_time 或获得锁这两个事件的先到来者为止 template class Clock, class Duration unique_lock( mutex_type m,const std::chrono::time_pointClock,Duration timeout_time ); //C11 起类 unique_lock除了提供 lock_guard有的基础功能外还提供了锁定等相关的方法使得其更加灵活方便其提供的方法有 函数说明备注lock锁定关联互斥公开成员函数try_lock尝试锁定关联互斥若互斥不可用则返回公开成员函数try_lock_for试图锁定关联的定时可锁互斥若互斥在给定时长中不可用则返回公开成员函数try_lock_until尝试锁定关联可定时锁互斥若抵达指定时间点互斥仍不可用则返回公开成员函数unlock解锁关联互斥公开成员函数swap与另一std::unique_lock 交换状态公开成员函数release将关联互斥解关联而不解锁它公开成员函数mutex返回指向关联互斥的指针公开成员函数own_lock测试锁是否占有其关联互斥公开成员函数operator bool测试锁是否占有其关联互斥公开成员函数std::swapstd::swap对 unique_lock 的特化功能与其成员函数swap类似非成员函数 示例 #include mutex #include thread #include iostream #include vector #include chronoint main() {int counter 0;std::mutex counter_mutex;std::vectorstd::thread threads;auto worker_task [](int id) {std::unique_lockstd::mutex lock(counter_mutex);counter;std::cout id , initial counter: counter \n;lock.unlock();// 我们模拟昂贵操作时不保有锁std::this_thread::sleep_for(std::chrono::seconds(1));lock.lock();counter;std::cout id , final counter: counter \n;};for (int i 0; i 10; i) threads.emplace_back(worker_task, i);for (auto thread : threads) thread.join(); }可能的输出 0, initial counter: 1 1, initial counter: 2 2, initial counter: 3 3, initial counter: 4 4, initial counter: 5 5, initial counter: 6 6, initial counter: 7 7, initial counter: 8 8, initial counter: 9 9, initial counter: 10 6, final counter: 11 3, final counter: 12 4, final counter: 13 2, final counter: 14 5, final counter: 15 0, final counter: 16 1, final counter: 17 7, final counter: 18 9, final counter: 19 8, final counter: 204. 两者之间的不同 lock_guard的使用方法非常简单通过构造函数上锁在销毁的时候解锁对于一些简单的场景使用也非常方便高效但对于一些作用域比较大的场景可能会影响效率例如如下场景 int g_i 0; std::mutex g_i_mutex; // 保护 g_ivoid safe_increment() {std::lock_guardstd::mutex lock(g_i_mutex);g_i;std::cout std::this_thread::get_id() : g_i \n;//流程1开始...//流程1结束// g_i_mutex 在锁离开作用域时自动释放 }如上例所述如果流程1的过程特别长而且不涉及g_i的操作如果使用lock_guard的话会导致g_i上锁时间特别长影响其他线程的对其所有权的获取影响整个代码的运行效率。因此针对这种应用场景我们应该使用unique_lock对g_i进行互斥锁管理我们可以在流程1的开始处进行手动解锁提前释放g_i的所有权提高程序的效率。 int g_i 0; std::mutex g_i_mutex; // 保护 g_ivoid safe_increment() {std::unique_lockstd::mutex lock(g_i_mutex);g_i;std::cout std::this_thread::get_id() : g_i \n;lock.unlock(); //提前释放g_i的所有权//流程处理1开始....//流程处理1结束// g_i_mutex 在锁离开作用域时检测到已经unlock了就不会再次调用unlock }注对于上面的例子lock_guard也可以通过{ }来控制lock_guard对象的作用域进而将控锁的范围进一步缩小。 unique_lock除了提供可以手动解锁的方法外还额外提供了try_lock_for、try_lock_until等带时间的加锁方法以及其他的特殊方法我们可以根据不同的应用场景选择合适的方法。 5. 总结 unique_lock与lock_guard最大的区别在于unique_lock提供了手动解锁的方法增加了中途解锁的功能而不是像lock_guard必须等待对象析构时解锁增加了控锁数据的精细程度提高程序的效率。 同时unique_lock还提供了更多的公有方法供我们按需使用。但是方便肯定是有代价的unique_lock在增加这些新方法的同时方法内部也增加一些新的逻辑和资源占用例如unlock功能其内部需要维护一个锁的状态所以整体在效率上会比lock_guard差一点。因此对于普通的简单场景lock_guard也是不错的选择。 文章首发公众号iDoitnow如果喜欢话可以关注一下
http://www.w-s-a.com/news/519897/

相关文章:

  • 网站开发面试自我介绍软件下载网站如何建设
  • 可以做翻译任务的网站陕西省建设厅八大员证
  • 昆明 网站推广重庆网页优化seo公司
  • 网站排名下降怎么上去设计一套app页面多少钱
  • 专门用来查找网址的网站查公司名字是否被注册
  • 自己创建网站教程河南省建设厅官方网站李学军
  • 一个网站需要多少容量怎样免费设计网站建设
  • 建设工程交易中心网站12306的网站是哪个公司做的
  • 建设网站经营范围自己给公司做网站
  • 河北省住房建设厅政务网站网络营销推广的岗位职责有哪些
  • 上海网站建设优化价格孝义做网站的公司
  • 哪个公司网站做的最好义乌 网站 制作
  • 百度站长工具综合查询wordpress 上传pdf
  • 旅游短租公寓网站建设深圳龙岗招聘网
  • 做海淘是在哪个网站网络查控系统设计方案
  • o2o网站建设代理商微信公众号开发文档
  • 网站设计课程总结关于网站备案的公告
  • 网站建设与运营意义到哪查找网站域名
  • 网站及单位网站建设情况眉县住房和城市建设局网站
  • 网站是否能够被恶意镜像wordpress占用
  • 经典设计网站网站等保测评怎么做
  • 重庆做网站公司贴吧廊坊公司快速建站
  • 海外贸易在什么网站做怎么排名到百度第一页
  • 线上注册公司是在哪个网站做高仿网站
  • 网站构架图网上推广平台哪个好
  • 公司网站首页图片素材vi设计的目的和意义
  • 网站的需求分析都有哪些内容济南营销型网站建设团队
  • 怎么选择优秀的网站建设公司生鲜网站开发
  • 如何编写网站建设销售的心得网站的权限管理怎么做
  • 网站业务员好做吗无忧网站优化