← 模式
创建线程
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
开始在新创建的线程中执行。这意味着 func
和 main
的主体将并发执行。如果系统支持并行执行,它们可能会并行执行。
在 第 17 行,我们调用了 t
的 join
成员函数。这会使 main
所在的线程阻塞,直到新线程执行完毕(即 func
返回时)。一旦 join
返回,main
所在的线程会继续执行。
注意:线程在销毁前必须被 join(汇合)或 detach(分离),否则 std::terminate
将被调用。
注意:如果 func
传播了一个异常,std::terminate
将被调用。