Mr Loser

C++11黑科技——thread

2019-04-21 09:00:41


前言

在C++11中,加入了一个名叫thread的类。这在OI中用不上(而且也用不了)但在程序开发中有这不小的作用。它的作用是管理线程,可以用它来实现多线程操作,需要引入thread库。

尝试

运行如下代码:

#include<thread>
#include<iostream>
using namespace std;
void print(int i){
    cout<<i<<endl;
}
int main(){
    for(int i=0;i<=10;i++){
        thread t(print,i);  //构造函数中第一个参数是要执行的函数的地址,第二个参数是调用函数时的实参。
        t.detach();     //使用detach方法使线程在后台运行,不阻塞程序运行。
    }
    system("pause>nul");
}

注意,编译时要加-std=c++11开关,否则无法通过编译。

得到输出结果:

012
5710
3

6

9
8

为什么不是我们所预想的从0到10顺序的输出且换行呢?因为我们的控制台只有一个,而线程有很多个。这就导致了这些线程争夺控制台,无法按顺序输出。至于输出中有残缺,是因为线程还没有执行完成,程序就结束了。

如果我们稍作改动:

#include<thread>
#include<iostream>
using namespace std;
void print(int i){
    cout<<i<<endl;
}
int main(){
    for(int i=0;i<=10;i++){
        thread t(print,i);
        t.join();       //此处改动
    }
}

输出结果就是我们预想的那样了。因为join方法是阻塞程序直到线程结束,也就是说,每次循环调用print函数,执行完成之后才会进行下一个循环。