Chinaunix首页 | 论坛 | 博客
  • 博客访问: 473243
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2015-02-05 14:08
个人简介

c++ programmer

文章分类

全部博文(41)

文章存档

2020年(2)

2018年(3)

2017年(23)

2016年(13)

我的朋友

分类: C/C++

2016-12-23 16:05:41

Thread


同步工具组件

1. atomic

2. mutex

互斥量都是不可拷贝的,也不提供转移语法。

非递归式互斥量不可多次锁定。

① 种类: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方法解锁。

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_guardcall_once

① thread_guard:类似于lock_guard,可以控制thread对象析构时的行为。例如thread_guard,thread_guard<>,前者在线程对象析构时分离线程,后者则为线程对象默认操作,即在线程对象析构时,终止线程运行。

② call_once:在多线程运行统一可调用物时,保证可调用物只被运行一次

4. 条件变量condition_variablecondition_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. futureshared_futureasync

① 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 源码。

阅读(1443) | 评论(0) | 转发(0) |
0

上一篇:smart pointer

下一篇:interprocess

给主人留下些什么吧!~~