CppCoreGuidelines CP.23 把 joining_thread 当作一个带作用域范围的容器
27 June 2023
“Think of a joining thread as a scoped container”
理由
为了确保指针安全,避免泄露,我们要考虑下,在线程中用到了哪些指针。如果一个线程会自动 join,我们就可以安全传递这些线程作用域范围内的指针。
例子
void f(int* p) { // ... *p = 99; // ... } int glob = 33; void some_fct(int* p) { int x = 77; joining_thread t0(f, &x); // OK joining_thread t1(f, p); // OK joining_thread t2(f, &glob); // OK auto q = make_unique<int>(99); joining_thread t3(f, q.get()); // OK // ... }
gsl::joining_thread
是一个带有析构器,能 join 且不能 detached()
的线程。这里说的“OK”是指指针所指向的对象能在线程存活时间内一直有效。线程是否并行运行不会影响存活周期、指针所有权。可以把这些线程当作是在 some_fct
中调用的函数对象。
强化
保障 joining_thread
不被 detach()
。这样之后,就可以检查强化一般的生命周期和所有权规则。