**
C++ std::thread重要知识点总结**
1.创建线程方法
(1)C++11中使用thread创建线程,创建线程必须传入一个可执行体作为参数,启动线程建议使用join。
(2)C++11很提供了packaged_task类型,不用直接使用std::thread和std::promise,直接就能够生成线程,但需要自己启动任务。
#include
#include
using namespace std;
int f() {
string hi = “hello, world!”;
cout << hi << endl;
return hi.size();
}
int main() {
packaged_task<int ()> task(f);
auto result = task.get_future();
task();
cout << result.get() << endl;
return 0;
}
输出为:
hello,world
13
2.在不同线程之间传递数据
C++中使用std::promise和std::future两种数据结构来实现数据在不同线程之间传递。其中promise为范型的数据结构,既线程之间传递的数据类型由promise定义,如promise:promise,则线程之间传递的数据是整形。
promise的get_future()方法返回的是一个future数据结构。
std::future提供一个访问异步操作结果的途径。
使用场景如:主线程中获取子线程的数据
(1)主线程中定义一个promise,命名为p;
(2)主线程调用p.get_future(),并把返回值保存为引用f
(3)主线程启动一个子线程,并把p作为启动参数传给子线程
(4)主线程调用f.get(),但是此时子线程还未将数据放入promise内,所以主线程挂起
(5)子线程执行完,获取到结果,并把结果写入p
(6)主线程从f.get()的调用中被唤醒,获取到子线程写入p的值,继续执行
3.线程的一些控制函数
(1)std::this_thread表示当前线程
(2)get_id(),获取线程唯一ID
(3)sleep_for(),使线程成睡一定时间
4.程序退出相关函数
(1)abort():异常中止程序,不承诺清理资源
(2)exit(),正常退出整个程序(包括所有线程)对于C++程序而言,会调用静态对象的析构函数,并处理好IO缓冲。如果想使用exit()来从多线程函数中退出,必须等所有的线程都执行完。如果不进行这个同步的话,exit()执行的时候会对析构静态对象,而哪些在调用exit()之后才运行结束的线程也会析构静态对象,会导致对静态对象的二次析构,从而导致未定义的结果
5.条件变量std::condition_variable作用
条件变量 std::condition_variable 是为了解决死锁而生,当互斥操作不够用而引入的。比如,线程可能需要等待某个条件为真才能继续执行, 而一个忙等待循环中可能会导致所有其他线程都无法进入临界区使得条件为真时,就会发生死锁。condition_variable 实例被创建出现主要就是用于唤醒等待线程从而避免死锁,td::condition_variable的 notify_one() 用于唤醒一个线程;notify_all() 则是通知所有线程。下面是一个生产者和消费者模型的例子: