D.1-chinese
D.1 <chrono>头文件<chrono>头文件作为time_point的提供者,具有代表时间点的类,duration类和时钟类。每个时钟都有一个is_steady静态数据成员,这个成员用来表示该时钟是否是一个稳定的时钟(以匀速计时的时钟,且不可调节)。std::chrono::steady_clock是唯一个能保证稳定的时钟类。 头文件正文 123456789101112131415namespace std{ namespace chrono { template<typename Rep,typename Period = ratio<1>> class duration; template< typename Clock, typename Duration = typename Clock::duration> class time_point; class system_clock; class steady_cloc...
D.2-chinese
D.2 <condition_variable>头文件<condition_variable>头文件提供了条件变量的定义。其作为基本同步机制,允许被阻塞的线程在某些条件达成或超时时,解除阻塞继续执行。 头文件内容1234567namespace std{ enum class cv_status { timeout, no_timeout }; class condition_variable; class condition_variable_any;} D.2.1 std::condition_variable类std::condition_variable允许阻塞一个线程,直到条件达成。 std::condition_variable实例不支持CopyAssignable(拷贝赋值), CopyConstructible(拷贝构造), MoveAssignable(移动赋值)和 MoveConstructible(移动构造)。 类型定义12345678910111213141516171819202...
D.3-chinese
D.3 <atomic>头文件<atomic>头文件提供一组基础的原子类型,和提供对这些基本类型的操作,以及一个原子模板函数,用来接收用户定义的类型,以适用于某些标准。 ###头文件内容 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475#define ATOMIC_BOOL_LOCK_FREE 参见详述#define ATOMIC_CHAR_LOCK_FREE 参见详述#define ATOMIC_SHORT_LOCK_FREE 参见详述#define ATOMIC_INT_LOCK_FREE 参见详述#define ATOMIC_LONG_LOCK_FREE 参见详述#define ATOMIC_LLONG_LOCK_FREE 参见详述#define ATOMIC_CHAR16_T_LOCK_FREE 参见详述#define...
D.4-chinese
D.4 <future>头文件<future>头文件提供处理异步结果(在其他线程上执行额结果)的工具。 头文件内容 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647namespace std{ enum class future_status { ready, timeout, deferred }; enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied, no_state }; class future_error; const error_category& future_category(); error_code make_error_code(future_errc e); error_co...
D.5-chinese
D.5 <mutex>头文件<mutex>头文件提供互斥工具:互斥类型,锁类型和函数,还有确保操作只执行一次的机制。 头文件内容 1234567891011121314151617181920212223242526272829303132namespace std{ class mutex; class recursive_mutex; class timed_mutex; class recursive_timed_mutex; struct adopt_lock_t; struct defer_lock_t; struct try_to_lock_t; constexpr adopt_lock_t adopt_lock{}; constexpr defer_lock_t defer_lock{}; constexpr try_to_lock_t try_to_lock{}; template<typename LockableType> clas...
D.6-chinese
D.6 <ratio>头文件<ratio>头文件提供在编译时进行的计算。 头文件内容 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354namespace std{ template<intmax_t N,intmax_t D=1> class ratio; // ratio arithmetic template <class R1, class R2> using ratio_add = see description; template <class R1, class R2> using ratio_subtract = see description; template <class R1, class R2> using ratio_multiply = see description; template <clas...
D.7-chinese
D.7 <thread>头文件<thread>头文件提供了管理和辨别线程的工具,并且提供函数,可让当前线程休眠。 头文件内容 12345678910111213141516171819namespace std{ class thread; namespace this_thread { thread::id get_id() noexcept; void yield() noexcept; template<typename Rep,typename Period> void sleep_for( std::chrono::duration<Rep,Period> sleep_duration); template<typename Clock,typename Duration> void sleep_until( std::chrono::time_point<Clock,Duration> wake_time);...
A.0-chinese
附录A 对C++11语言特性的简要介绍新的C++标准,不仅带来了对并发的支持,也将其他语言的一些特性带入标准库中。在本附录中,会给出对这些新特性进行简要介绍(这些特性用在线程库中)。除了thread_local(详见A.8部分)以外,就没有与并发直接相关的内容了,但对于多线程代码来说,它们都是很重要。我已只列出有必要的部分(例如,右值引用),这样能够使代码更容易理解。由于对新特性不熟,对用到某些特性的代码理解起来会有一些困难;没关系,当对这些特性渐渐熟知后,就能很容易的理解代码。由于C++11的应用越来越广泛,这些特性在代码中的使用也将会变越来越普遍。 话不多说,让我们从线程库中的右值引用开始,来熟悉对象之间所有权(线程,锁等等)的转移。
A.1-chinese
A.1 右值引用如果你从事过C++编程,你会对引用比较熟悉,C++的引用允许你为已经存在的对象创建一个新的名字。对新引用所做的访问和修改操作,都会影响它的原型。 例如: 1234int var=42;int& ref=var; // 创建一个var的引用ref=99;assert(var==99); // 原型的值被改变了,因为引用被赋值了 目前为止,我们用过的所有引用都是左值引用——对左值的引用。lvalue这个词来自于C语言,指的是可以放在赋值表达式左边的事物——在栈上或堆上分配的命名对象,或者其他对象成员——有明确的内存地址。rvalue这个词也来源于C语言,指的是可以出现在赋值表达式右侧的对象——例如,文字常量和临时变量。因此,左值引用只能被绑定在左值上,而不是右值。 不能这样写: 1int& i=42; // 编译失败 例如,因为42是一个右值。好吧,这有些假;你可能通常使用下面的方式讲一个右值绑定到一个const左值引用上: 1int const& i = 42; 这算是钻了标准的一个空子吧。不过,这种情况我们之前也介绍过,我们通过...
A.2-chinese
A.2 删除函数有时让类去做拷贝是没有意义的。std::mutex就是一个例子——拷贝一个互斥量,意义何在?std::unique_lock<>是另一个例子——一个实例只能拥有一个锁;如果要复制,拷贝的那个实例也能获取相同的锁,这样std::unique_lock<>就没有存在的意义了。实例中转移所有权(A.1.2节)是有意义的,其并不是使用的拷贝。当然其他例子就不一一列举了。 通常为了避免进行拷贝操作,会将拷贝构造函数和拷贝赋值操作符声明为私有成员,并且不进行实现。如果对实例进行拷贝,将会引起编译错误;如果有其他成员函数或友元函数想要拷贝一个实例,那将会引起链接错误(因为缺少实现): 1234567891011class no_copies{public: no_copies(){}private: no_copies(no_copies const&); // 无实现 no_copies& operator=(no_copies const&); // 无实现};no_copie...














