线程学习小结
·概要:
最早接触的是windows平台的线程--需要使用windows的API,然后转战Linux平台—Linux平台的线程没有windows平台的线程高效的原因是Linux平台主要以进程为主而线程则是通过进程实现的(我的理解)。
线程从某种程度上来说就是一个函数--也就是通常说的线程函数,而这个函数是可以在进程中同时运行的--多线程的概念。入口函数main函数就是一个线程--主线程,而其他线程则需要指定线程函数。
·要点:
时间:
thread库中的时间使用的是boost自己的日期时间库--即依赖于datatime库;
主要使用的是boost::posix_time::中的millisec/milliseconds,
microsec/microseconds表示时间的长度;
thread库提供了system_time—typede boost::posix_time::ptime;
thread库提供了非成员函数get_sytem_time()来获取当前时间点;
可以通过get_system_time()+system_time(…)表示任意时间点;
thread类:
当成功创建thread对象后,线程就开始执行--在构造函数中指定线程函数;
线程函数一般使用bind方式提供--算是一种惯例吧也可以使用类方法;
提供joinable(),join()和timed_join()来判断和阻塞等待线程结束;
提供detach()实现与线程执行体分离--及thread对象不再持有线程函数;
提供get_id()获取线程id对象—boost定义的class id类型;
提供静态成员函数:
yield()--协同,放弃时间片允许其他线程执行;
sleep()--需要的参数是一个时间点;
hardware_concurrency()--获取服务器的CPU内核数;
提供interrupt()允许中断正在执行的线程--被中断线程函数会抛出异常;
被中断的线程函数抛出的异常是thread_interrupted,不处理就中断线程;
可被中断的线程在线程函数内部要有可中断点:
thread::join(),thread::timed_join(),thread::sleep(),
condition_variable::wait(),condition_variable::timed_wait(),
condition_variable_any::wait(),
condition_variable_any::timed_wait(),
this_thread::sleep(),this_thread::interruption_point();
this_thread命名空间:
提供自由函数get_id(),yield(),sleep()三个函数;
提供启动/禁用线程终端控制函数;
提供at_thread_exit()函数来指定当线程结束后要执行的函数;
thread_group类:
内部使用std::list<thread*>来容纳创建的thread对象;
提供create_thread()工厂函数创建并记录新thread对象;
提供了add_thread()/remove_thread()管理线程池;
提供join_all()和interrupt_all()来操作线程池内的所有thread对象;
互斥量:
thread库提供七种互斥量:
mutex,try_mutex,timed_mutex,shared_mutex(读写锁),
recursive_mutex,recursive_try_mutex,recursive_timed_mutex;
同时提供了mutex::scoped_lock和mutex::scoped_try_lock的便利类;
提供的通用接口有:lock(),try_lock()和unlock(),timed_lock();
条件变量:
有condition_variable和condition_variable_any(推荐)两种;
提供的接口有:notify_one(),notify_all(),wait()和timed_wait();
示例是生产者-消费者模型;
future范式:
提供一种异步操作线程返回值的方法;
使用packaged_task和promise两个模版类来包装异步调用,
用unique_future和shared_future来获取异步调用结果;
其他:
可使用两个自由函数lock()和try_lock()来锁定互斥量;
可通过使用once_flag对象来控制仅初始化一次;
barrier同步是在线程执行到barrier时等待其他所有线程都执行到这个点;
涉及到静态变量函数因为多线程的执行不确定性所以不可作为线程函数;
解决方法是使用thread提供的thread_specific_ptr智能指针;
·小结:
在我的工作中,涉及到thead的就是多线程通信了。