C++并发(二)
- 低级接口thread和promise与高级接口的区别
thread对象没有发射策略,尽量开启新线程。
没有接口获取线程结果,只有线程ID。
必须用exception_ptr导出异常,否则一旦线程异常溢出,程序terminate()。
线程必须join()或者detach(),否则terminate(),线程发生移动分配,一样terminate().
线程在main()结束前未终止,强行终止。 - thread
quick_exit()结束程序时不析构global和static 对象,保留detach线程要访问的资源安全性。
线程启动时存储线程ID以识别线程
std::thread::id thred1_ID;
std::thread thred1(doSomething);
thread1_ID=thred1.get_id();
- promise
promise与thread配合
int main()
{
try
{
std::promise<std::string>p;
std::thread t(doSomething,std::ref(p));
t.detach;
std::future<std::string>f(p.get_future());
do something aboult f;
}
catch(const std::exception&e)
{
...
}
catch(...)
{
...
}
}
p.set_value();
p.set_exception();
//两者只能set一个,否则报错,ready时线程不一定结束
//若想要线程结束时才ready,如下
p.set_value_at_thread_exit();
p.set_exception_at_thread_exit();
- packaged_task,运行多个类似后台任务
double compute(int x,int y);
std::packaged_task<double(int,int)>task(compute);
std::future<double> f=task.get_future();
task(3,4);
double tmp=f.get();