15.2 Tasks and threads
如果某种运算能够与其他运算同时进行,那么我们将其称为task。而一个程序中的task,在系统层面则被称为thread。通过构建一个std::thread,我们可以执行一个能够同时运行的task。一个task可以是一个函数或者一个function object。
void f(); // 函数 struct F { void operator() (); // function object } void user() { thread t1 {f}; // f()将在独立的thread中执行 thread t2 {F()}; // F()()将在独立的thread中执行 t1.join(); // 等待t1 t2.join(); // 等待t2 }
函数join()将会保证,我们直到thread完成之后才会退出user()。
一个程序中的thread将会分享同一个地址空间。也就是说,每个process的thread将会各有不同,它们一般不会直接共享数据。由于thread共享一个地址空间,他们可以通过共享的对象进行交互。这一类交互通常被lock或者其他的机制所控制,以防止数据冲突。
多线程下的编程将会较为复杂。假设任务f(函数)与F(function object)的实现如下:
void f() { cout << "Hello"; } struct F { void operator()() { cout << "Parallel World!\n"; } };
上述代码中f与F()都使用了cout,但是没有进行任何形式的同步。最后的输出结果将变得不可预测。程序可能会输出“PaHerallllel o World!”。
当我们定义多线程程序的任务时,我们的目标是保持任务的独立性。