Thread同步工具组件1. atomic2. mutex互斥量都是不可拷贝的,也不提供转移语法。非递归式互斥量不可多次锁定。① 种类:6种mutexa. null_mutex:空对象。b. mutex:独占式互斥量。c. timed_mutex:提供超时的独占式互斥量。d. recursive_mutex:递归式互斥量,多次锁定,多次解。e. recursivfe_timed_mutex:提供超时的递归式互斥量。f. shared_mutex:共享互斥量。 ② 成员函数:任何种类mutex都提供lock和unlock成员函数,用于无限期尝试锁定和尝试解锁互斥量。提供超时功能的互斥量提供try_lock_for和try_lock_until方法在一段时间或某时间点前尝试锁定互斥量,其仍使用unlock方法解锁。3. locker① lock_guard:简单自动锁类。不可拷贝,不提供转移语法。用作写锁定-独占。public方法只有构造函数和析构函数,构造函数要求传入一个互斥量的引用,构造函数锁定互斥量,析构函数解锁互斥量。适用于所有mutex,但是对于shared_mutex只能获得写锁定。② unique_lock:根据不同构造函数,有不同行为。用作写锁定-独占。默认构造函数行为与lock_guard相同。其他构造函数可能在构造时不锁定互斥量,而提供lock,try_lock,try_lock_for和try_lock_until用于手动锁定互斥量。提供owns_lock和operator()判断是否已经锁定互斥量。适用于所有mutex,但是对于shared_mutex只能获得写锁定。③ shared_lock:自动共享锁,用作读锁定-锁定后允许其他线程shared_lock锁定,但不允许lock_guard和unique_lock锁定。只适用于shared_mutex。线程工具组件1. thread① 线程对象不可拷贝,但提供转移语法相关函数。② 一般来说,线程创建需要传递一个无参的可调用物,可以是函数,函数对象或者lambda表达式;如果可调用物不是无参的,thread使用拷贝传参。③ thread对象一创建时就立刻开始执行线程,thread对象析构时会调用std::terminate结束线程执行,所以要保证线程正确运行需要调用thread::join等待线程运行完成,或者调用thread::detach分离线程。④ 成员函数:a. thread(): 空的构造函数,不执行任何线程。b. tread(F f): 构造函数,创建对象后立刻执行f。c. joinable():判断是否可join。d. join():等待线程,无限等待,当线程执行完成后才返回。e. try_join_for(const duration&):超时等待,等待一段时间,无论线程是否执行完成都返回。f. try_join_for(const time_point&):超时等待,等待到指定时间点,无论线程执行是否执行完成都返回。g. interrupt():中断线程。h. interruption_requested():判断线程是否被中断。i. get_id():获取线程ID。⑤ 静态成员函数:a. hardware_concurrency():获取可并发的核心数。b. physical_concurrency():获取真实CPU核心数。⑥ 自由函数:定义在命名空间this_thread中:a. get_id():获取当前线程的ID。b. yield():放弃当前线程的时间片。c. sleep_for:当前线程睡眠一段时间。d. sleep_until:当前线程睡眠到某个时间点。2. thread_group① thread_group对象不可拷贝,也不提供转移语法函数。② 成员函数:a. create_thread():创建一个立即运行的线程对象,并加入到thread_group对象中,只支持可无参调用物线程创建方式。b. add_thread():添加已有线程到thread_group对象。c. remove_thread():从thread_group对象中删除一个线程。d. is_this_thread_in():判断当前运行的线程是否在thread_group对象中。e. is_thread_in():判断指定线程是否在thread_group对象中。f. join_all():等待所有线程执行完成。g. interrupt_all():中断所有线程:h. size():获取thread_group对象中线程的数量。3. thread_guard、call_once① thread_guard:类似于lock_guard,可以控制thread对象析构时的行为。例如thread_guard,thread_guard,前者在线程对象析构时分离线程,后者则为线程对象默认操作,即在线程对象析构时,终止线程运行。② call_once:在多线程运行统一可调用物时,保证可调用物只被运行一次。4. 条件变量condition_variable和condition_variable_any条件变量必须和互斥量配合使用。① 成员函数:a. wait():一直等待。b. wait_for():等待一段时间。c. wait_until():等待至某个时间点。d. notify_one():通知一个等待中的线程。e. notify_all():通知所有等待中的线程。调用等待函数wait,wait_for和wait_until时会解锁互斥量,以便让其他尝试锁定互斥量的线程成功锁定互斥量,等待函数返回时,会重新锁定互斥量。调用通知函数notify_one和notify_all时,会使等待线程中的等待函数返回。5. future、shared_future、async① future:异步操作线程返回值方法。类似于thread,但提供future作为返回值。成员函数:a. get():获取feature值。b. wait():一直等待,直到异步线程执行完成。c. wait_for():等待一段时间。d. wait_until():等待至某个时间点。e. valid():是否为有效值。 f. is_ready():是否计算完毕。g. has_exception():是否有异常发生。h. has_value():是否有值。i. share():产生一个shared_future对象。future对象只能用get()方法获取一次,不能被多个线程并发访问。② shared_future:可以线程安全的多次调用get()取值。其成员方法与future一致。async默认产生future对象,若要产生shared_future对象,需要手动指定或者使用future::share()产生。③ async:创建异步操作线程,返回future或者shared_future对象。@boost笔记系列总结自罗剑锋的《Boost库完全开发指南》第三版、Boost 1.61.0 Library Documentation、boost 1.51 源码。
10-01 03:12