一、

 int mythread(){
cout<<"thread"<<endl;
std::chrono::milliseconds dura();//5秒钟
std::this_thread::sleep_for(dura);//休息5秒钟
return ;
} int main(){
std::future<int> result = std::async(mythread); //是个枚举类型有ready,timeout,deferred
std::future_status status = result.wait_for(std::chrono::second());//等1秒,
if(status==std::future_status::timeout){
//线程要执行5秒,这里只等待1秒,希望你返回,你没有返回那么status 是 timeout
}
else if(status==std::future_status::timeout){
//表示线程成功返回
cout << result.get() <<endl;
}
else if(status==std::future_status::deffered){
//如果saync第一个参数设置这个deffered,这个线程被延迟执行
//遇到get线程才会执行,mythread会在主线程中执行(相当于在主线程中的一个函数调用),就不是真正意义上的子线程了
cout<<res.get()<<endl;
}
}

shared_future

类模板,使用get函数时就是复制了,第二次使用get还会成功

 int mythread(){
cout<<"thread"<<endl;
std::chrono::milliseconds dura();//5秒钟
std::this_thread::sleep_for(dura);//休息5秒钟
return ;
} int main(){
std::future<int> result = mypt.get_future();
std::shared_future<int> result_s(std::move(result));//move变成右值,将result 过渡给了result_s,result里就空了,移动语义
//不能直接用result_s(result),会报错,接受的是一个右值属性的,所以要用move变成右值属性
//这样也可以:std::shared_future<int> result_s(result.share());
ifcanget = result_s.valid();//true or false }

原子操作

互斥量:多线程编程中,保护共享数据

锁:操作共享数据,开锁

有两个线程,对一个变量进行操作,这个线程读该变量值,另一个线程往这个线程中写值。

A线程: tmp = bbb;//bbb是多线程中共享的变量

B线程: bbb = 6;

注意:B中的赋值语句,会有多个操作步骤(汇编中可能有n多行汇编代码),有可能你执行到汇编代码第x行的时候线程B就切出去了,这个时候A读到的变量就是B赋值过程中的中间值。

解决这个问题可以用互斥量,但是这样效率会很慢。

使用原子操作就能够解决这个问题,类似于锁,但是效率比互斥量高很多。保证赋值这个操作执行完。

可以把原子操作理解为一种,不需要互斥量加锁(无锁)技术的多线程并发变成方式

也可以理解为在多线程中,不会被打断程序执行片断,无锁操作,比互斥量效率高。

一般互斥量针对一个代码段(几行代码),而原子操作针对一个变量,而不是代码段。

原子操作:指不可分割的操作,也就是说这种操作状态要么是完成的,要么是没完成的,不能出现半完成状态。

std::atomic类模板,用来封装某个类型的值

 std::automic<int> g_mycount = ;//封装了一个类型为int的对象,可以像操作一个int变量一样来操作g_mycount

                 //g_mycount++;是一个原子操作,每一次的操作不会被打断

 void mythread(){
std::chrono::milliseconds dura();//
while(g_ifend==false){
std::this_thread::sleep_for(dura);//没一秒钟判断一次g_ifend
}
cout<<"结束"<<endl;
return;
} int main(){
thread my1(mythread);
thread my2(mythread);
std::chrono::milliseconds dura();
std::this_thread::sleep_for(dura);
g_ifend = true;
my1.join();
my2.join();
cout<<"end"<<endl;
}

十、future其他成员函数、shared_future、atomic(原子操作)的更多相关文章

  1. C++并发与多线程学习笔记--future成员函数、shared_future、atomic

    std::future的其他成员函数 std::shared_future 原子操作.概念.基本用法 多线程主要是为了执行某个函数,本文的函数的例子,采用如下写法 int mythread() { c ...

  2. 条目二十八《正确理解由reverse_iterator的base()成员函数所产生的iterator的用法》

    条目二十八<正确理解由reverse_iterator的base()成员函数所产生的iterator的用法> 迭代器的种类一共有四种,上面已经说过了.这里就不再次写出来. 这一个条目主要是 ...

  3. 读书笔记_Effective_C++_条款四十五:运用成员函数模板接受所有兼容类型

    比如有一个Base类和一个Derived类,像下面这样: class BaseClass {…}; class DerivedClass : public BaseClass {…}; 因为是父类与子 ...

  4. C++(三十二) — 常对象、常成员变量、常成员函数

    常量:对于既需要共享.又需要防止改变的数据.在程序运行期间不可改变. const 修饰的是对象中的 this 指针.所以不能被修改. 1.常对象 数据成员值在对象的整个生存期内不能改变.在定义时必须初 ...

  5. C++(十六) — 类中引用成员函数、命名空间的使用

    1.为什么类中引用成员函数? 类将属性和方法做了封装.类是一种数据类型,也就是:固定大小内存块的别名. 类的定义是一个抽象的概念,定义时不分配内存,当用类定义对象时,才分配一个固定大小的内存块. 此时 ...

  6. Item 16: 让const成员函数做到线程安全

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果我们在数学领域里工作,我们可能会发现用一个类来表示多项式会很方 ...

  7. 并发之java.util.concurrent.atomic原子操作类包

    15.JDK1.8的Java.util.concurrent.atomic包小结 14.Java中Atomic包的原理和分析 13.java.util.concurrent.atomic原子操作类包 ...

  8. atomic 原子操作

    原子操作:操作仅由一个独立的CPU指令代表和完成.保证并发环境下原子操作的绝对安全 标准库代码包:sync/atomic atomic是最轻量级的锁,在一些场景下直接使用atomic包还是很有效的 C ...

  9. C++11开发中的Atomic原子操作

    C++11开发中的Atomic原子操作 Nicol的博客铭 原文  https://taozj.org/2016/09/C-11%E5%BC%80%E5%8F%91%E4%B8%AD%E7%9A%84 ...

随机推荐

  1. day39—JavaScript缓冲运动

    转行学开发,代码100天!——2018-04-24 今天继续学习JavaScript运动之缓冲运动.相对于匀速运动,缓冲运动的不同之处在于其速度值是不断变化的,越靠近目标点,速度越小. 即可以表示为: ...

  2. iview 表格 某一列中设置radio

    在iview 表格 某一列中设置radio,说白了还是要在render中添加,方法为: { title: '业务参数设置', // key: 'pyCode', align: 'center', re ...

  3. apt-get updete以及apt-get upgrade的区别

    You should first run update, then upgrade. Neither of them automatically runs the other. apt-get upd ...

  4. 《剑指offer》面试题5 从尾到头打印链表 Java版

    书中方法一:反转应该立刻想到栈,利用一个栈完成链表的反转打印,但是用了额外的O(n)空间. public void printFromTail(ListNode first){ Stack<Li ...

  5. UVA1626 括号序列 Brackets sequence(区间dp)

    题目传送门(洛谷)   题目传送门(UVA) 解题思路 很显然是一个区间dp,当然记忆化搜索完全可以AC,这里说一下区间dp. 区间dp的重要特征就是需要枚举中间节点k 看一看这道题,用f[i][j] ...

  6. P2737 [USACO4.1]麦香牛块Beef McNuggets

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是“劣质的包装”.“看,”奶牛们说,“如 ...

  7. Python自学第二天学习之《字符串与数字》

    一.基本数据类型: 数字:int类型,不可变类型 格式 : a=10 1.其他类型转换成int型 : b=“123” c=int(b) #转换类型 print(c)----- 123 print(ty ...

  8. Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,消息队列有什么优点和缺点

    面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: ...

  9. k8s常用笔记

    安装docker // 安装docker $ yum install -y docker-ce // 开机启动 && 启动服务 $ systemctl enable docker &a ...

  10. H5手机端底部菜单覆盖中间部分内容的解决办法

    一.第一种Js动态计算中间内容的高度. 二.第二种给底部上面写个<div style="底部的高度"></div> 三.第三种给中间部分写一个margin- ...