读书笔记《C++并发编程实战》(2) - 线程管理

等待线程完成:
    join;只可调用一次,此外最好在调用之前调用joinable测试是否可调用;此外调用join后线程已不可用,joinable将fanhuifalse。
    
分离线程:
    detach:一般作为后台运行的线程,有时候还是有用的。但需要处理好线程所持有的资源、生命周期的问题,可以使用长生命周期的资源
    或者拷贝一份资源到该线程的堆栈里而不是共享使用资源。调用detach后线程执行与线程对象将无关联也无法再被加入。
    同样的,最好在调用之前调用joinable测试是否可调用。

构造函数:
    构造函数传递参数时,采用的是默认复制参数到线程的内部堆栈空间,可能会出现非预期的结果。此时可以采用std::ref包装对象(实际上
    为取得包装对象的地址),以达到线程内部引用外部参数对象的目的而不是复制拷贝副本。
 
线程所有权的转移:
    thread支持线程所有权的转移,也即是一个特定执行的线程的所有权可以在thread对象实例间移动。也即支持std::move语义或者直接赋值实例
    对象(赋值对象应为临时变量对象则可用直接赋值的方式否则需要用std::move语义)。
    此外不可对一个已有线程所有权的thread对象再获取新的其他thread对象的线程所有权,可能导致进程终止(因此可以增加joinable测试)。

运行时选择线程数量:
    充分利用多核芯的处理器的硬件并发能力,std::thread::hardware_currency获取当前系统CPU的核心数量(可能返回0)。
    
线程标识:
    std::thread::id(一个类包装了线程id标识值),可通过线程对象std::thread::get_id()或者std::this_thread::get_id()获取当前线程的标识。
    此标识符id有时可作为区分不同的线程的标识。在检查某个线程可以执行或不可执行某些操作时,或者在调试、日志等方面比较有用。
    

猜你喜欢

转载自www.cnblogs.com/haomiao/p/11647384.html