C语言学习网

C++怎么正确使用线程

发表于:2022-08-11 作者:安全数据网编辑
编辑最后更新 2022年08月11日,这篇文章主要介绍"C++怎么正确使用线程",在日常操作中,相信很多人在C++怎么正确使用线程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C++怎么正确使用线程"的疑惑

这篇文章主要介绍"C++怎么正确使用线程",在日常操作中,相信很多人在C++怎么正确使用线程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C++怎么正确使用线程"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

CP.26:不要分离线程

Reason(原因)

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

Example(示例)

void heartbeat();

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

这段代码是线程的合理用法,其中通常会使用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 tick_tock {nullptr};

void use()
{
// heartbeat is meant to run as long as tick_tock lives
tick_tock = make_unique(heartbeat);
// ...
}
Enforcement(实施建议)

Flag detach().

标记分离(detach)操作。

到此,关于"C++怎么正确使用线程"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0