十、future其他成员函数、shared_future、atomic(原子操作)

一、

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

shared_future

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

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

原子操作

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

锁:操作共享数据,开锁

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

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

B线程: bbb = 6;

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

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

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

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

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

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

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

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

 1 std::automic<int> g_mycount = 0;//封装了一个类型为int的对象,可以像操作一个int变量一样来操作g_mycount
 2 
 3                 //g_mycount++;是一个原子操作,每一次的操作不会被打断
 4 
 5 void mythread(){
 6     std::chrono::milliseconds dura(1000);//1
 7     while(g_ifend==false){
 8         std::this_thread::sleep_for(dura);//没一秒钟判断一次g_ifend
 9     }
10     cout<<"结束"<<endl;
11     return;
12 }
13 
14 int main(){
15     thread my1(mythread);
16     thread my2(mythread);
17     std::chrono::milliseconds dura(5000);
18     std::this_thread::sleep_for(dura);
19     g_ifend = true;
20     my1.join();
21     my2.join();
22     cout<<"end"<<endl;
23 }
原文地址:https://www.cnblogs.com/pacino12134/p/11245002.html