• 【C++11并发】thread 笔记


    简介

    进程和线程的区别
    进程:一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。
    线程:进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。
    与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。更多

    std::thread就是C++11为开发者提供的线程类。他表示一个线程,一般在构造的时候,就会启动他的线程方法。线程方法的返回值会被忽略,一般通过std::promise或者共享变量来获取。如果线程方法抛出了一场,没有被处理的话,std::terminate就会被调用。

    头文件

    #include 
    
    • 1

    API

    构造方法

    thread() noexcept;	// 默认构造方法
    thread( const thread& ) = delete;   // 禁用拷贝构造方法
    thread( thread&& other ) noexcept;	// 移动构造方法,暗示着一个thread对象只能表示一个线程,不与其他thread对象共享
    
    // f:可调用对象;args:f的参数;如果开调用对象无法正常起启动,就会抛出异常[std::system_error](https://en.cppreference.com/w/cpp/error/system_error)
    // args是采用移动或者以值的方法传递f,如果想采用引用方式需要用std::ref或者std::cref包装一下
    template< class Function, class... Args >
    explicit thread( Function&& f, Args&&... args );	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    例子:https://en.cppreference.com/w/cpp/thread/thread/thread

    析构方法

    ~thread();	// 如果当前thread对象依然关联着线程,即joinable() == true, 那么就会调用std::terminate()被调用
    
    • 1

    移动赋值操作符

    thread& operator=( thread&& other ) noexcept;	// 如果当前thread对象依然关联着线程,即joinable() == true, 那么就会调用std::terminate()被调用
    
    • 1

    成员方法

    • 判断thread是否关联着一个有效线程,如果thread被移动、销毁了,或者调用thread默认构造方法构造的对象,那么该方法就返回false
    bool joinable() const noexcept;
    
    • 1
    • 获取线程id
    std::thread::id get_id() const noexcept;   // 线程的唯一标识
    
    • 1

    std::thread:id是一个类,一般常用的方法有:operator==, operator<<。另外有一个特化的hash仿函数:template<> struct hashstd::thread::id; hash参考代码

    • 获取thread对象关联的线程句柄,一般与pthread_getschedparam,pthread_setschedparam配合使用,可以设置线程的优先级。
      更多参考
    native_handle_type native_handle();
    
    • 1
    • 获取硬件支持的最大线程数,他是thread的静态方法
    static unsigned int hardware_concurrency() noexcept;
    
    • 1
    • 等待线程函数执行结束,他会阻塞当前线程。可能会抛出std::system_error异常
    void join();
    
    • 1
    • 分离线程与thread对象,即thread对象不在管理该线程,joinable方法会返回false,调用join方法会抛出异常。当线程方法执行结束的时候,相关资源才会被释放。可能会抛出std::system_error异常
    void detach();
    
    • 1
    • 交换两个thread对象关联的线程
    void swap( std::thread& other ) noexcept;
    
    • 1

    在线尝试thread

  • 相关阅读:
    将Visual Studio Code配置成好用的Python IDE
    Maxwell 一款简单易上手的实时抓取Mysql数据的软件
    昨日阅读量898
    巴西队提前出线,预定大力神杯?数据分析告诉你,到底谁才是冠军
    Linux驱动开发 --- 架构方面的一些感悟
    运行软件mfc100u.dll缺失是怎么办?mfc100u.dll丢失解决方法分享
    Bean作用域和生命周期
    C++八股
    CMake库搜索函数居然不搜索LD_LIBRARY_PATH
    ADC测试杂谈一:配置基于matlab+quartus的测试环境
  • 原文地址:https://blog.csdn.net/A_cainiao_A/article/details/134496809