你现在有一个比较好的C++11的编译器,那么接下来呢?一个多线程的C++程序是什么样的?它看上去和其他的C++程序没什么两样,都是变量类和函数的混合。唯一的不一样可能是他们是同步执行的,所以你需要确定并行访问的数据是安全的,当然为了并行运行函数,必须使用特定的类和函数管理不同的线程。
1.4.1 你好并行的世界
一个程序打印“HelloWorld”,在单线程中的运行程序:
#include <iostream>
int main()
{
std::cout << "Hello World\n";
}
并行程序中:
#include <iostream>
#include <thread>
void hello()
{
std::cout << "Hello Concurrent World\n";
}
int main()
{
std::thread t(hello);
t.join();
}
第一个不同是#include <thread>,这个是多线程库的头文件:管理多线程的函数和类在thread中声明,但是保护共享数据的声明在其他头文件中
第二,打印的代码被移到一个单独的函数中,这是因为每个线程都必须有一个初始函数,它是新线程的执行开始,对于一个程序的初始线程是main函数,但是对于每一个在std::thread object中指定的线程必须有一个新函数作为它的起始函数,比如本程序中的hello()。
下面的不同:比直接在main中写标准的输出或调用hello,这个程序时新建一个线程去执行。一共有两个线程,一个是main的起始线程(主线程),一个是执行hello的线程。
新线程被执行后,主线程继续执行,如不等待新线程完成,它将继续执行到结束,可能在新线程有机会执行前。这就是为什么调用join()函数,它将等待线程执行完。
对于标准输出这样简单的工作去使用多线程是不值得的,特别是主线程没什么事情要做。稍后我们将展示一个使用多线程的例子。