c++ programmer
分类: C/C++
2016-12-23 16:05:41
互斥量都是不可拷贝的,也不提供转移语法。
非递归式互斥量不可多次锁定。
① 种类:6种mutex
a. 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方法解锁。
① 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。
① 线程对象不可拷贝,但提供转移语法相关函数。
② 一般来说,线程创建需要传递一个无参的可调用物,可以是函数,函数对象或者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:当前线程睡眠到某个时间点。
① 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对象中线程的数量。
① thread_guard:类似于lock_guard,可以控制thread对象析构时的行为。例如thread_guard,thread_guard<>,前者在线程对象析构时分离线程,后者则为线程对象默认操作,即在线程对象析构时,终止线程运行。
② call_once:在多线程运行统一可调用物时,保证可调用物只被运行一次。
条件变量必须和互斥量配合使用。
① 成员函数:
a. wait():一直等待。
b. wait_for():等待一段时间。
c. wait_until():等待至某个时间点。
d. notify_one():通知一个等待中的线程。
e. notify_all():通知所有等待中的线程。
调用等待函数wait,wait_for和wait_until时会解锁互斥量,以便让其他尝试锁定互斥量的线程成功锁定互斥量,等待函数返回时,会重新锁定互斥量。
调用通知函数notify_one和notify_all时,会使等待线程中的等待函数返回。
① 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 源码。