thread_group--线程池
Thread_group用于管理一组线程,类似一个线程池,使用std::list<thread*>来荣纳创建的thread对象
Thread_group类摘要
Class thread_group //不可拷贝
{
Public:
Thread * create_thread(F threadFunc); //创建新线程
Void add_thread(thread * thrd); //添加已有线程
Void remove_thread(thread* thrd); //删除线程
Bool is_this_thread_in(); //当前线程是否在组内
Bool is_thread_in(thread * t); //指定的线程是否在组内
Void join_all(); //等待所有线程
Void interrupt_all(); //中断所有线程
Int size(); //获得线程数量
};
Create_thread()是工厂函数,可创建thread对象并运行,同时加入到内部LIST中,但他不支持传递函数参数,所以通常要用bind或者lambda来包装执行的函数。
可以通过先创建线程对象,后加入线程池。
扩展:future+async()+promise+barrier+本地存储
Future范式提供了异步操作线程返回值的方法,如此叫的原因是这个返回值在线程开始执行时还是不可用,是一个未来的期待值。
早期future == unique_future 即只能调用一次get(),他不能被多线程并发访问。
而shared_future是其增强版,可多次线程安全的调用get(),其他基本与unique_future一致
Promise 配合thread使用,可作为函数的输出参数,可以利用set_value/get_value传出future.
Barrier是thread基于条件变量提供的另一种同步机制,可用于多个线程同步。
当直行至barrier时必须等待,直到所有线程都到达这个点才可以继续。
Barrier又称为rendezvous(约会地点)
本地存储。引入原因:有用到局部静态变量或者全局静态变量的函数不可用于多线程环境,因为无法保证多线程变量在多线程环境下的重入时的正确性。
This_thread::at_thread_exit(function f)保证被此调用的函数在线程异常中断时仍被调用。