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

黑龙江省和城乡建设厅网站免费咨询律师电话

黑龙江省和城乡建设厅网站,免费咨询律师电话,简述网站建设主要流程,软装设计公司名字怎样在不加锁的情况下解决线程安全问题#xff0c;你需要了解lock free和wait free这两个概念#xff0c;在此之前我们先从最简单的有锁编程开始。 我们知道#xff0c;多线程同时修改共享变量时会出现数据不一致的问题#xff0c;比如多个线程同时对一个变量加1#xff…怎样在不加锁的情况下解决线程安全问题你需要了解lock free和wait free这两个概念在此之前我们先从最简单的有锁编程开始。 我们知道多线程同时修改共享变量时会出现数据不一致的问题比如多个线程同时对一个变量加1假设count的初始值为0 int count;void add() {count; } 如果只有一个线程调用add函数那么什么问题都没有但如果多个线程同时调用上述函数比如10个线程都调用一遍那么count值最后不一定等于0原因在于对count加1的操作不是原子的 。 所谓某个操作是原子的是指CPU要么执行该操作要么不执行该操作不存在中间状态但上述对count加1的操作经过编译器处理后会生成几条对应的机器指令所以该操作不是原子的。 那么怎样才能让其变成原子的呢很简单加一把锁。 int count; mutex mtx; // 锁void add() {mtx.lock();count;mtx.unlock(); }; 现在我们用一把锁将对count的操作保护了起来此时你可以将mtx.lock()以及mtx.unlock()中间的代码看成原子的CPU要完全执行完对count的加1要么根本不会操作count这样上述程序的运行结果就是我们想要的了。 这是怎样做到呢这就要说到操作系统了千万不要小瞧了上面的mutex这把锁这把锁的背后相当复杂因为这涉及到了操作系统。 假设现在有三个线程各自运行在不同的CPU核心上每个方框代表一个时间片 T1时间片这三个线程都在调用add函数线程A拿到锁A可以继续向前推进但B和C就没这么幸运了此时操作系统将剥夺线程B和C继续持有CPU的权利将其分配给其它具备执行条件的线程这就是操作系统中所谓的挂起注意这个过程相当复杂因为这涉及到用户态与内核态的切换以及线程的切换等等。 此时来到T2时间片线程A继续向前推进线程B和C则被按下暂停键。 T3时间片然而就在线程A拿到锁运行时因为某些原因像高优先级线程枪占之类导致操作系统也剥夺了线程A继续持有CPU的权利糟糕的是因为线程A此时持有锁而线程A又无法继续向前推进这就进一步使得线程B和C也无法继续向前推进。 你会发现在T3时刻这几个线程都没有任何进展根本原因在于我们为解决多线程问题加互斥锁惊动了操作系统而这类互斥锁是操作系统给我们实现的那么解决线程安全问题一定要经过操作系统吗 不是的在硬件层面也可以解决线程安全问题硬件层面当然是指CPU或者说机器指令。 CPU中有特定的原子指令实际上操作系统也是基于这些指令实现的互斥锁既然操作系统能用这些指令我们(用户态)也可以使用这些指令基于此我们可以将上述代码进行简单改造 int count 0;void add() {int old_value;do {old_value count;} while (!atomic_compare_exchange(count, old_value, old_value 1)); } 此时add函数是线程安全的我们也没有对其进行加锁不管多少线程同时调用add函数得到count都是正确的而该函数的执行完全不涉及操作系统 不需要操作系统来维护秩序利用的就是CPU中的原子指令CPU在硬件层面一样可以替我们维护秩序。 资料直通车Linux内核源码技术学习路线视频教程内核源码 学习直通车Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈 上述代码就是所谓lock-free的不管操作系统怎样调度这三个线程我们都能确保这三个线程中总有一个能继续向前推进 。 lock-free的系统看起来像这样 对于这类系统不存在某个时间片下线程都无法推进的情况 换句话说就是lock-free程序保证至少有一个线程能继续向前推进。 可以看到lock-free给出了比普通锁更优的保障。 但不能简单从代码是不是加锁或不加锁去判断代码是否lock-free 回旋锁也是没有上述互斥锁的也不经过操作系统但回旋锁并不是lock-free的如果你这样利用CPU中的原子操作修改add函数 int count 0; int lock 0; // 回旋锁void add () {int expected 0;while(!atomic_compare_exchange_weak(lock, expected, 1))expected 0;count;lock 0; } 这就是典型的回旋锁然而如果某个线程持有回旋锁后被操作系统挂起那么其它线程开始无效的执行死循环除了白白消耗CPU之外它们都无法继续向前推进显而易见如果此时系统负载较高那么此类程序的性能会变差。 既然现在你已经知道了lock-free我们再继续优化这段代码 std::atomicint count;void add() {count; } 这段代码没有锁也不需要用循环不断检测是否有其它线程修改count不管操作系统如何调度这三个线程它们都能在有限的操作数内执行完成 此时我们说该程序是wati-free的wait-free系统运行起来像这样 可以看到在任意时间片内不管操作系统怎样调度所有线程都能向前推进 。 wait-free比lock-free的要求更高更加严格由于wait-free的程序总是能在有限的步骤内执行完成因此实时性是最好的适用于那些对实时性要求较高的场景当然实现难度也要比lock-free更高。 值得注意的是wait-free以及lock-free程序的实现通常不是那么简单。
http://www.hkea.cn/news/14401615/

相关文章:

  • 美食网站建设的功能做塑料的网站
  • 做阿里云网站的公司一级做爰片a视频网站试看
  • wordpress 建站容易吗市场调研报告范文2000
  • 有哪些搜索引擎网站中国网库网站介绍
  • 零食网站页面模板网站免费源码大全
  • 找人做企业网站 注意什么重庆网站模板建站
  • 经销商自己做网站wordpress跳转链接地址
  • 淘宝优惠券网站怎么做 知乎外贸网有哪些
  • 做韩国外贸网站seo推广收费标准
  • 济南网站建设选搜点网络wordpress 网络公司主题
  • vipkid网站开发团队网站怎么做详情页
  • 网站链接地图是怎么做的免费域名注册申请
  • 国内搜索网站排名国内免费crm系统
  • 博客网站是自己做的吗专业网络推广外包公司
  • 帝国小说网站模板wordpress全站源码
  • 中国建设银行官网站基金查询域名弄好了网站怎么建设
  • 做外包网站搭建重庆造价信息价查询
  • 分销网站制作条件台州百度推广优化
  • 沧州做网站的大公司个人餐饮网站模板
  • 重庆网站建设外包链天网站建设
  • 搜狐快站绑定未备案的网站域名吗苏州市住房和城乡建设局网站首页
  • 企业网站优化多少钱天元建设集团有限公司承兑
  • 信阳做网站公司汉狮价格杭州尚层别墅装饰公司
  • 外贸网站推广平台排名前十名深圳广告公司排行
  • 贸易公司做网站有优势吗太原市住房和城乡建设局的网站首页
  • 手表网站上没有价格网站不公开简历做家教
  • 手机网站免费模板下载烟台网站关键词推广
  • 网站建设时间安排表网站建设实训体会
  • 网站建设语言什么语言网站集成微信登录
  • 网站改手机版wordpress 栏目页