专栏首页C++核心准则原文翻译C++核心准则CP.26:不要分离线程

C++核心准则CP.26:不要分离线程

CP.26: Don't detach() a thread

CP.26:不要分离线程

Reason(原因)

Often, the need to outlive the scope of its creation is inherent in the threads task, but implementing that idea by detach makes it harder to monitor and communicate with the detached thread. In particular, it is harder (though not impossible) to ensure that the thread completed as expected or lives for as long as expected.

通常,生命周期超过创建它的线程的需求继承自线程任务,但是通过分离(detach)实现这个想法使得监视和与分离的线程进行通信更加困难。在特殊情况下,很难(虽然不是不可能)确保线程可以像期望的那样中止或继续动作。

Example(示例)

void heartbeat();

void use()
{
    std::thread t(heartbeat);             // don't join; heartbeat is meant to run forever
    t.detach();
    // ...
}

This is a reasonable use of a thread, for which detach() is commonly used. There are problems, though. How do we monitor the detached thread to see if it is alive? Something might go wrong with the heartbeat, and losing a heartbeat can be very serious in a system for which it is needed. So, we need to communicate with the heartbeat thread (e.g., through a stream of messages or notification events using a condition_variable).

这段代码是线程的合理用法,其中通常会使用detach()。虽然这个做法存在问题。我们如何监视一个分离的线程以便知道它是否处于活动状态?心跳线程可能发生某些问题,对于需要心跳功能的系统来说,丢失心跳是很严重的问题。因此,我们需要和心跳线程通信(例如通过一个信息流或使用condition_variable的通知事件)。

An alternative, and usually superior solution is to control its lifetime by placing it in a scope outside its point of creation (or activation). For example:

另外一个可选的,通常是更高级的做法是将它放到创建它(或者激活它)的作用域之外。例如:

void heartbeat();

gsl::joining_thread t(heartbeat);             // heartbeat is meant to run "forever"

This heartbeat will (barring error, hardware problems, etc.) run for as long as the program does.

心跳线程将会和程序运行同样长的时间(除非发生错误,硬件问题等情况)。

Sometimes, we need to separate the point of creation from the point of ownership:

有时,我们需要将生成视点和所有权视点相分离。

void heartbeat();

unique_ptr<gsl::joining_thread> tick_tock {nullptr};

void use()
{
    // heartbeat is meant to run as long as tick_tock lives
    tick_tock = make_unique<gsl::joining_thread>(heartbeat);
    // ...
}

Enforcement(实施建议)

Flag detach().

标记分离(detach)操作。

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#cp26-dont-detach-a-thread

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则E.6:使用RAII防止资源泄露

    Leaks are typically unacceptable. Manual resource release is error-prone. RAII (...

    面向对象思考
  • C++核心准则CP.41:尽量回避线程的生成和销毁处理

    This spawns a thread per message, and the run_list is presumably managed to dest...

    面向对象思考
  • C++核心准则C.42:如果构造函数不能生成合法对象就抛出异常

    Leaving behind an invalid object is asking for trouble.

    面向对象思考
  • 查看CPU信息小脚本

    echo "                  the `hostname` cpuinfo                       "

    三杯水Plus
  • Smart Template component rendering process - part 1 till xml view creation

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    Jerry Wang
  • 前端自动化测试实践03—jest异步处理&mock

    一般项目代码中会有不少异步 ajax 请求,例如测试下面 async.js 中的代码

    CS逍遥剑仙
  • 基于活动和情绪为基础为自动驾驶汽车设计路线 (CS HC)

    我们的日常生活中有很大一部分时间都用来驾驶,这导致了我们不可避免地承受与驾驶相关的压力。自动驾驶汽车的兴起可能会减轻这种压力的程度,并提升日常出行的体验。然而,...

    Antonia
  • Maven 整合Tomcat 容器

    整合之前,我们都是使用本地的 Tomcat 服务器进行开发测试,最最头疼的一个问题就是每次做项目都要手动导入 jar 包,随着功能越来越多导入的 jar 包也越...

    wsuo
  • Linux 内核参数优化(for oracle)

        Oracle 不同平台的数据库安装指导为我们部署Oracle提供了一些系统参数设置的建议值,然而建议值是在通用的情况下得出的结论,并非能完全满足不同的需...

    Leshami
  • Java 集合系列(二)—— ArrayList

      ArrayList 是通过一个数组来实现的,因此它是在连续的存储位置存放对象的引用,只不过它比 Array 更智能,能够根据集合长度进行自动扩容。

    那一叶随风

扫码关注云+社区

领取腾讯云代金券