27 June 2023

C++ 核心指南目录

“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() 。这样之后,就可以检查强化一般的生命周期和所有权规则。