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

重庆建站培训wordpress 404

重庆建站培训,wordpress 404,动漫制作技术专业就业方向,js做网站好吗目录 一.thread构造函数 二.移动构造#xff0c;移动赋值 小结 三.获取线程id的方法 四.thread与lambda表达式联用 五.Mutexs的总览 六.互斥锁 七.Locks的总览 八. 条件变量总览 九.条件变量的wait和notify 十.典型例题 十一.原子类 十二.智能指针和单例模式的线…目录 一.thread构造函数 二.移动构造移动赋值 小结  三.获取线程id的方法 四.thread与lambda表达式联用 五.Mutexs的总览 六.互斥锁  七.Locks的总览 八. 条件变量总览 九.条件变量的wait和notify  十.典型例题 十一.原子类 十二.智能指针和单例模式的线程安全问题 一.thread构造函数 void Print(int n) {for (int i 0; i n; i){cout I am a thread: i endl;} } int main() {thread t(Print, 1000);t.join();return 0; } 如果想要传递引用需要使用ref()函数将对象包装成引用以便向下传递。原因在于参数并不是直接传递给执行的方法中间经过了thread的构造函数为了完美转发保持属性而产生副作用生成了一个拷贝的临时对象则执行方法中引用的是临时对象非const左值引用来引用临时对象是不被允许的。(简单说一说底层非常复杂不值得深究)。 如果用const引用来接收就不必使用ref bind也是如此如果想要传递引用就必须ref 二.移动构造移动赋值 thread类的拷贝构造被禁用但是有移动构造和移动赋值以应对需要同时创建多个线程的场景 void Print(int j, int n) {for (int i j; i n; i){cout thread id: this_thread::get_id() , i endl;} } int main() {const int threadNum 5;vectorthread threads(threadNum);for (int i 0; i threads.size(); i){threads[i] thread(Print, 0, 1000); //匿名对象右值调用移动赋值减少拷贝}for (int i 0; i threads.size(); i){threads[i].join();}return 0; }//移动构造 /* for (int i 0; i threadNum; i) {threads.emplace_back(thread(Print, 0, 1000)); //emplace_back调用移动构造} */ 思考thread禁用了拷贝构造有办法把用一个thread对象构造另一个对象吗  //使用移动构造副作用t1将不可用 thread t1(Print, 0, 1000); thread t2(move(t1)); 小结  创建线程的方法 用有参的构造传递方法和参数创建多个线程用容器集中管理时使用移动构造或者移动赋值将一个线程的资源转移给另一个线程move移动构造 三.获取线程id的方法 //线程的执行方法中获取 this_thread::get_id(); //线程外获取 t.get_id(); //t是创建的线程对象 四.thread与lambda表达式联用 lambda表达式的优势在于能捕获局部的变量而无需传参 int x 0; int main() {int n1 10000;int n2 10000;thread t1([n1](){for (int i 0; i n1; i){x;}});thread t2([n2](){for (int i 0; i n2; i){x;}});t1.join();t2.join();cout x endl;return 0; }//注意以上代码有线程安全问题 五.Mutexs的总览 六.互斥锁  mutex不支持拷贝只能引用 int x 0; void Add(int n, mutex mtx) //这里的互斥锁只能用引用接收因为mutex禁用了拷贝构造 //mtx不能加const否早无法lockunlock {mtx.lock();for (int i 0; i n; i){x;}mtx.unlock(); } int main() {mutex mtx;thread t1(Add, 10000, ref(mtx)); //想要传锁必须使用ref把mutex包装成一个引用对象thread t2(Add, 10000, ref(mtx)); //因为mtx不是直接传给Add的中间经过thread的构造函数 //最终Add引用的是mtx的拷贝(完美转发保持属性的同时生成了一个拷贝的临时对象简单说一说不必深究)t1.join();t2.join();cout x endl;return 0; } 七.Locks的总览 八. 条件变量总览 九.条件变量的wait和notify  十.典型例题 int main() {//让t1和t2两个线程从1开始交替打印奇数和偶数int x 1;mutex mtx;condition_variable cond;thread t1([](){while (true){unique_lockmutex lck(mtx);while (x % 2 0){cond.wait(lck);}cout thread 1: x endl;x;Sleep(1000);cond.notify_one();}});thread t2([](){while (true){unique_lockmutex lck(mtx);while (x % 2 1){cond.wait(lck);}cout thread 2: x endl;x;Sleep(1000);cond.notify_one();}});t1.join();t2.join();return 0; } 十一.原子类 临界区操作非常少的情况不适合加互斥锁。因为这会导致线程状态频繁切换不断地阻塞和唤醒。此时就可以使用C多线程库提供的atomic类来封装内置类型使用atomic类提供的“原子”接口。这里的原子二字打了引号因为严格来说它并非真正意义上的原子只不过表现出来的是原子性的效果。当然日常交流中说它是原子操作也没问题。 首先需要明确一个概念被保护后的临界区也并不是原子的。原子操作是不可中断的操作要么全部执行成功要么全部不执行没有中间状态。而临界区操作涉及多个指令或操作步骤收线程调度影响可能会被中断。只不过采用互斥的机制保护使得任意时刻只有一个线程进入临界区从而避免了数据不一致问题达到了原子性的效果。 CAS操作CAS即Comparre and Swap它是CPU提供的原子操作。这才是真正意义上的原子操作它由硬件支持X86下对应的是CMPXCHG 汇编指令。 这个操作所做的工作是先比较目标内存的值是否和预期的值一样(Compare)如果一样就进行赋值(Swap-把寄存器的值和目标内存的值进行交换)如果不一样就啥都不做 bool compare_and_swap (int *addr, int oldval, int newval) {if ( *addr ! oldval ) {return false;}*addr newval;return true; } atomic的接口底层就是使用的CAS操作。 例如: int a 0; a; atomicint a(0); a; atomic或者说CAS操作适用于对公共资源操作非常简单的情况例如对一个整型变量进行那么CAS的成功率就比较高相较于加锁可以减少线程状态切换的开销。但是如果操作比较多还是加锁合适。 十二.智能指针和单例模式的线程安全问题 智能指针是线程安全的吗 首先unique_ptr通常用于独占所有权的情况它被设计为独占所有权的智能指针通常情况下只能由一个线程拥有和访问。因此不建议多个线程使用同一个unique_ptr其内部并没有提供线程安全保护机制使用结果是未定义的。 其次shared_ptr中的引用计数是会被公共访问的资源涉及到--判断等操作。shared_ptr内部提供了保护措施要么是加锁保护要么使用atomic这样的原子操作。   所以虽然unique_ptr没有保护机制但是人家设计的初衷就是用于独占资源的情况不按要求使用那是你自讨苦吃而shared_ptr内部有保护机制可以供多个线程使用。 综上智能指针是线程安全的但是智能指针管理的资源不是线程安全的需要用户自己保护。 单例模式是线程安全的吗 饿汉模式在main函数之前就创建了对象没有线程安全问题。但是懒汉模式就有调用获取实例的接口首先会判断指向实例的指针是否为空如果为空就创建实例。那么就有可能多个线程同时通过if判断而创建出多个实例。 所以需要在判断之前加锁保护。 但是线程安全问题仅仅是第一次调用接口时才会出现后续每次获取实例都要申请锁太消耗时间了所以外层再套一个if判断如果是空指针就加锁否则直接返回。 其实懒汉模式还有另一种简单巧妙的实现方式不把实例创建在堆区而是创建静态对象。 这份代码在C11之后是线程安全的静态对象不管如何只会初始化一次初始化静态对象是原子的。 但C11之前它是线程不安全的静态对象在多线程情况下初始化动作式未定义的。
http://www.zqtcl.cn/news/218785/

相关文章:

  • 济南建设银行网站应用制作app软件
  • 网站开发实习个人小结关于做展厅的网站
  • 网站设计三把火如何制作动漫网站模板
  • 重庆做网站 哪个好些嘛开通qq空间申请网址
  • 制作网站 太原买的电脑没有wordpress
  • 图书馆建设投稿网站可信网站认证logo
  • 专做阀门网站网站如何做银联在线支付
  • 南通网站seo网页制作图片轮播
  • 高端品牌网站建设哪家好中医网站模板
  • 怎么做多语言网站图片添加文字在线制作
  • js特效演示网站wordpress本地视频
  • 徐州做网站哪个好上海国际人才网
  • 黑龙江省城乡和住房建设厅网站首页公司营业执照查询
  • 锦州北京网站建设支付公司网站建设会计分录
  • 泉州做网站优化价格软件公众号开发
  • 商丘旅游网站的建设攀枝花城市建设网站
  • 网站主页设计素材一条龙做网站
  • 咖啡店网站首页怎么做163邮箱注册
  • 网站开发开源程序网站建设及推广销售话术
  • 门户网站和官网的区别美间在线设计平台
  • 淮南制作网站游戏代理哪个平台正规
  • seo网站推广软件 快排手机网页小游戏
  • 上海免费网站建设品牌长沙com建站网站设计
  • 大网站成本品牌设计风格
  • 电大形考任在哪个网站做湖南seo推广服务
  • dede网站 异步生成wordpress 页面新建
  • 郑州网站制作网页网站优化我自己可以做吗
  • 合肥做网站的公司百度做兼职去哪个网站
  • 重庆市城市建设规划官方网站一款app从开发到上线的流程
  • 微网站开发难吗登录qq网页版