C++11标准中添加了线程以及对线程相关的类。
线程在头文件<thread>中定义。
线程的构造函数:
std::thread::thread
thread(); //只是创建了一个新的线程对象而并不能代表线程。
thread( thread&& other ); //移动构造函数,可以接受从另外一个线程那转移过来的线程。
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args ); //支持可变参数。 f是代表函数, Args等代表传入函数的参数
thread(const thread&) = delete; //禁止拷贝构造函数
获取线程ID有两个方法:
- 调用Public function
- 使用嵌套类(member classes)
线程的基本用法:
获取当前线程ID有两个方法:
- 调用Public function
- 使用嵌套类(member classes)
线程休眠
sleep::for()
互斥锁:
互斥锁又可以称为互斥量(mutex),是一种同步原语,是一种线程同步的手段,用来保护多线程同时访问的共享数据。另外线程同步手段也可以称为线程间通信。
- mutex 独占式互斥锁,不能递归使用。
- timed_mutex 带超时的独占互斥锁, 不能递归使用。
- recursive_mutex 递归互斥锁, 不带超时功能。
- recursive_timed_mutex 带超时的递归互斥锁。
递归锁允许同一线程多次获得该互斥锁,可以用来解决同一线程需要多次获取互斥量时死锁的问题。
条件变量:
条件变量时C++11提供的另外一种用于等待的同步机制,它能阻塞或多个线程,直到收到另外一个线程发出的通知或者超时,才会唤醒当前阻塞的线程。条件变量需要和互斥锁配合起来使用。
- condition_variable
只能和std::unique<std::mutex>进行wait操作。
- condition_variable_any
能和任意的lock、unlock语义的mutex搭配使用,比较灵活,效率比condition_variable差。
条件变量使用步骤:
- 拥有条件变量的线程获取互斥量
- 循环检查某个条件,如果条件不满足,则阻塞直到条件满足;如果条件满足,则向下执行。
- 某个线程满足条件执行完之后调用notify_one或notify_all唤醒一个或者所有的等待线程。
异步操作:
- future
- promise
- package_task
- future