C++11并发(一)
- 头文件
#include<thread>//线程头文件
#include<chrono>//时间相关函数
- 高级接口
std::future<int> result1(std::async(func1));
int result2=func2();
int resulit=result1.get()+result2;
func1()在不支持线程或无线程可用时,通过get()会同步执行,否则益步执行。
要遵循 call early and return late。
launch策略有 std::launch::async(不赋值给future会停滞,future销毁前会执行完后台)和std::launch::deferred(延缓直至get())。
future1.wait_for(std::chrono::seconds(10));
future2.wait_until(std::system_clock::now()+std::chrono::minutes(1));
//返回 std::future_status::deferred\std::future_status::timeout\std::future_status::ready.
speculative execution(投机性运行)
int quickComputation();
int accurateCoputation();
std::future<int> f;
int bestResultInTime()
{
auto tp=std::chrono::system_clock::now()+std::chrono::minutes(1);
f=std::async(std::launch::async,accurateComputation);
int guess=quikCoputation();
std::future_status s=f.wait_until(tp);
if(s==std::future_status::ready)
{
return f.get();
}
else
{
return guess;
}
}
用类对象开线程
class A
{
public:
void mem(int num);
...
};
A a;
auto f=std::async(&A::mem,a,3);
...
int tmp=f.get();
shared_future可以多次get(),自身也可以传递引用,注意shared_future对象本身的生命周期。