首页 > 后端开发 > C++ > 正文

如何安全地将对象引用传递给 C 11 线程?

Patricia Arquette
发布: 2024-11-19 14:57:03
原创
512 人浏览过

How Can I Safely Pass Object References to C  11 Threads?

将对象引用参数传递给线程函数:构造函数问题

在 C 11 中,std::thread 接口允许创建轻量级线程。一项常见任务是将参数传递给这些线程函​​数,但在尝试传递对象引用时可能会出现困难。

考虑以下示例:

void foo(int &i) { std::cout << i << std::endl; }
int k = 10;
std::thread t(foo, k);
登录后复制

此代码成功编译并运行,如下所示整数被复制到线程函数中。但是,传递 std::ostream 对象引用不会编译:

void foo(std::ostream &os) { os << "This should be printed to os" << std::endl; }
std::thread t(foo, std::cout);
登录后复制

错误表示缺少或无法访问构造函数。

解决方案:使用 std::ref

线程默认复制它们的参数。要显式传递引用,需要一种替代方法。这就是 std::ref 的用武之地。它将对象引用包装在值语义包装器中。

通过使用 std::ref,线程函数接收包装器的副本,但包装的引用仍然存在相同:

std::thread t(foo, std::ref(std::cout));
登录后复制

这使得线程函数能够访问和修改原始对象,从而实现所需的功能。

值得注意的是,被引用的对象必须始终保持可访问性线程的执行。如果在线程完成之前删除或修改它,可能会发生意外行为或崩溃。

以上是如何安全地将对象引用传递给 C 11 线程?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板