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

网站建设结算方式太原市建设路小学网站

网站建设结算方式,太原市建设路小学网站,陕西省建设教育培训网,网站前期推广condition_variable::wait的锁 在看C Concurrency in Action 6.2.3节的线程安全队列时#xff0c;其对condition_variable的使用与常规用法有点不同#xff0c;我对condition_variable::wait中锁的作用产生了疑惑#xff1a;它究竟是保护的谁#xff1f;于是找到了 C noti…condition_variable::wait的锁 在看C Concurrency in Action 6.2.3节的线程安全队列时其对condition_variable的使用与常规用法有点不同我对condition_variable::wait中锁的作用产生了疑惑它究竟是保护的谁于是找到了 C notify_one之前应不应该加锁问题探讨 这篇文章解决了我的疑惑。 文中例子用到了单元测试框架gtest先安装一下 git clone https://github.com/google/googletest.git cd googletest cmake . make编译成功的话会在lib目录下生成libgmock.alibgmock_main.alibgtest.alibgtest_main.a头文件在include/gtest下如果想要安装到系统目录用root用户执行make install会将头文件拷贝到/usr/local/include/gtest将库文件拷贝到/usr/local/lib。 然后运行文中的例子 #include thread #include mutex #include condition_variable #include gtest/gtest.hbool flag false; std::mutex m; std::condition_variable cv;void Prod(void) {std::unique_lockstd::mutex lk(m);cv.wait(lk, []{ return flag; }); // #3 } void Cons(void) {flag true;cv.notify_one(); } TEST(notify_test, T01) {flag false; // #1std::thread tProd(Prod);std::thread tCons(Cons);tProd.join();tCons.join(); }int main(int argc, char *argv[]) {flag false; // #2testing::InitGoogleTest(argc, argv);return RUN_ALL_TESTS(); }可执行程序用参数--gtest_repeat-1运行意为一直重复执行下去。大概执行几百到几千次进程就会卡住。 语句3等价于 while(!flag) {cv.wait(lk); // #4 }考虑下面描述的情况线程tProd判断!flag条件成立准备wait线程tCons置flag为true并notify线程tProd进入wait阻塞。这样就导致了signal丢失线程tProd无法唤醒。 可以在语句4之前添加一个等待std::this_thread::sleep_for(std::chrono::milliseconds(100));让这个现象变得很明显这样几乎每次都会出现卡住的情况了。 另外如果去掉语句1无论语句2存在与否都没有出现卡住的情况不知是什么原因。 要解决掉这个问题只需要在Cons中修改flag时给加上锁 void Prod(void) {std::unique_lockstd::mutex lk(m);while(!flag){// 此时Cons拿不到锁就不可能设置flag也就不可能notifystd::this_thread::sleep_for(std::chrono::milliseconds(100));cv.wait(lk);} } void Cons(void) {{std::lock_guardstd::mutex lk(m);flag true;}cv.notify_one(); }所以wait的锁保护的是条件notify的时候不需要加锁但一定要在条件设置上以后调用。 再回过头来看看void condition_variable::wait(std::unique_lockstd::mutex lock);的描述atomically unlocks lock, blocks the current executing thread, and adds it to the list of threads waiting on *this. 如果解锁和阻塞操作不是原子的又会怎么样解锁后到进入阻塞的这段时间内如果别的线程拿到了锁并notify了一个信号此次信号会丢失。 线程安全队列 C Concurrency in Action 6.2.3节一步一步实现了线程安全队列。 开始封装了std::queue使用一个互斥量对数据队列进行保护。 为了使用细粒度锁用链表实现了一个单线程队列维护头尾两个指针从尾部push头部pop。因为头尾指针两个数据项便使用两个互斥量来保护头指针和尾指针。 当队列中只有一个元素时头尾指针相同head-next和tail-next是同一个对象这个对象需要保护。 然后添加了一个无数据的虚节点这个节点永远在队列的最后用来分离头尾指针能访问的节点。同时将节点的数据类型从T换成了std::shared_ptrTpush的时候也可先分配内存加锁后只需调用shared_ptr的移动构造虚节点中的数据是未初值化的shared_ptr。 再然后为了支持wait_and_pop添加了条件变量但是代码是有问题的本质上就是上节提到的问题stackoverflow上有描述 fine-grained locking queue in c。 问题复现代码如下 #include gtest/gtest.h threadsafe_queueint q; TEST(queue_test, T01) {std::thread a([]{q.wait_and_pop();});std::thread b([]{q.push(10);});a.join();b.join(); } int main(int argc, char *argv[]) {testing::InitGoogleTest(argc, argv);return RUN_ALL_TESTS(); }
http://www.hkea.cn/news/14454496/

相关文章:

  • 双辽建设局网站线上企业推广
  • 天宁建设网站wordpress博客插件
  • 建网站多少钱 万户自己的免费网站空间
  • 学雷锋_做美德少年网站怎么做自己的免费网站
  • 永州建设网站公司互联在线app开发网站
  • 网站开发工资多少钱浙江平台网站建设设计
  • 网站如何设置微信支付功能用eclipse做网站模板
  • 长安建网站公司wordpress侧边栏添加分类
  • 德州软件开发公司seo外包优化网站 sit
  • 用表格做的网站建筑网价格
  • 美食网站代做扁平化 wordpress 主题
  • 河北辛集住房和城乡建设厅网站山西城乡和建设厅网站首页
  • 容城县建设银行网站中国建设银行官网官网
  • 岳阳品牌网站定制开发网络维护公司需要什么资质
  • 网站响应时间 标准wordpress模板二次元
  • 沈阳做网站推广广告公司网站首页设计页面
  • 企业网站系统设计别墅装修一般多少钱一套
  • c 做网站 知乎北京宏福建设工程有限公司网站
  • 怎么分析网站建设的优缺点哪个网站有做商标
  • 常熟网站建设icp备案付费 视频 网站 怎么做
  • WordPress使用CDN无法登录网站推广优化外包公司
  • 那个网站做旅游规划好城乡和住房建设厅网站
  • 免费的代码分享网站网帆网站建设
  • 公司网站建设 目录网站设计 cdc
  • 中信银行网站怎么做的怎么烂网络规划设计师自学
  • 洛阳微网站建设企业宣传报道模板范文
  • 电子商务设计网站建设建筑工程机械人才培训网的证书
  • 宿州做网站的有吗快速搭建网站工具
  • 网站开发需要怎么做wordpress 栏目列表
  • 网站备案服务对于给不良网站发律师函如何做