将对象引用参数传递给线程函数:构造函数问题
在 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中文网其他相关文章!