← 模式

创建线程

123456789101112131415161718#include <thread> #include <string> #include <functional> void func(std::string str, int& x); void do_something(); int main() { std::string str = "Test"; int x = 5; std::thread t{func, str, std::ref(x)}; do_something(); t.join(); }

此模式采用 CC0 公共领域贡献 许可。

需要 c++11 或更新版本。

意图

在单独的线程上执行代码。

描述

第 13 行,我们创建了一个 std::thread 对象 t,它代表一个执行线程。在构造 t 时,我们将 func 作为要在该线程上执行的函数传入。

为了向 func 传递参数,我们已将它们作为额外参数传递给 std::thread 的构造函数。请注意,要通过引用传递参数,必须将其包装在 std::reference_wrapper 中 —— 为此,我们使用辅助函数 std::ref。对于 const 引用,请使用 std::cref

创建线程后,main 函数的其余部分会继续正常执行。同时,函数 func 开始在新创建的线程中执行。这意味着 funcmain 的主体将并发执行。如果系统支持并行执行,它们可能会并行执行。

第 17 行,我们调用了 tjoin 成员函数。这会使 main 所在的线程阻塞,直到新线程执行完毕(即 func 返回时)。一旦 join 返回,main 所在的线程会继续执行。

注意:线程在销毁前必须被 join(汇合)或 detach(分离),否则 std::terminate 将被调用。

注意:如果 func 传播了一个异常,std::terminate 将被调用。

贡献者

  • Joseph Mansfield
  • Mark A. Gibbs

最后更新

2017年12月9日

来源

在 GitHub 上 Fork 此模式

分享